汇编查找程序简单实现

datarea segment
 keyword      db    
5 ,?, 5  dup(?)
 sentence     db    
50 ,?, 50  dup(?)
 accesstalk1  db    
' Enter keyword:','$'
 accesstalk2  db     13 , 10 , ' Enter Sentence:','$'
 answer1      db     13 , 10 , ' Match At location:','$'
 answer3      db     ' H of the sentence.','$'
 answer4      db     13 , 10 , ' No Macthed!','$'
datarea ends
;
****************************************************
codearea segment
    assume  cs:codearea , ds:datarea , es:datarea
main  proc far

      push ds
      
sub  ax,ax
      push ax
      mov ax,datarea
      mov ds,ax
      mov es,ax
      ;
      lea dx,accesstalk1
      mov ah,09h
      
int  21h
      ;
      lea dx,keyword
      mov ah, 0ah
      
int  21h
      ;
 start:
      lea dx,accesstalk2
      mov ah, 09h
      
int  21h
      ;
      lea dx ,sentence
      mov ah, 0ah
      
int  21h
      ;
      lea si ,sentence
+ 2 ;这里是被比较的句子的起始位置,之所以要 + 2 ,是因为存放句子的空间中第一位存放的是句子可输入的最大长度,      ;第二位存放的是有效实际长度,从sentence + 2开始才是实际的要比较的字符串
      mov dl, sentence
+ 1 ;注意了,这里sentence + 1中的内容是字节类型的,DL是字节类型的,DX是字类型的,因为类型要匹配,所以DL
      mov dh, 
0
      mov cl, keyword
+ 1 ;这里面存放的是关键字的有效长度
      mov ch,
0
      
sub  dx,cx;见实验指导书中最多需要比较的次数
      inc dx
      lea bx,sentence
+ 2 ;bx里面放的是被比较句子的开始位置
      ; 
 
next :
      mov si ,bx;从这里开始循环比较,每次回过来的时候都要把si的值变成新的下一个字符的位置,见下面的BX,每次循环都要被加一
      lea di ,keyword
+ 2
      mov cl ,keyword
+ 1
      mov ch ,
0
      cld
      repz cmpsb;循环比较字符串是否匹配
      jz compare;当找到相同的字符串的时候时跳到compare里面
      dec dx;循环次数减一
      jz allover;当循环次数被减到等于零的时候呢,就要跳到allover里面去了,就是找遍了整个句子还是没有找到匹配的,跳转
      inc bx ;这边就是对BX加一,使得地址不断的往前移动
      jmp 
next ;这边是循环的实现,跳到上面的next
      ;
compare:
     
      lea dx,answer1
      mov ah,09h
      
int  21h
      ; 
      lea si ,sentence
+ 2
      
sub  bx,si
      inc bx;这里的bx等于bx比较完的时候的值,也就是地址,减去sentence
+ 2的标注的地址,得到的数值加上1就是第一个匹配位置
      
call  change;调用子函数,十进制到十六进制的转化
      lea dx,answer3
      mov ah,09h
      
int  21h
      jmp start 
     ;      
allover:
      lea dx ,answer4;小心使用的寄存器必须是DX,此次实验失败的原因是这里使用SI寄存器了!FUCK
      mov ah ,09h
      
int  21h
      jmp start
 ret
 main    endp
change  proc  near
        push  ax
        push  bx
        push  cx
        push  dx
        mov   ch,
4
rotate:
        mov   cl,
4
        rol   bx,cl
        mov   al,bl
        
and    al,0fh
        add   al,30h
        cmp   al,3ah
        jl    print
        add   al,7h
print:
        mov   dl,al
        mov   ah,
2
        
int    21h
        dec   ch
        jnz   rotate
        pop   dx
        pop   cx
        pop   bx
        pop   ax
        ret
change  endp
        codearea ends
        
end  main
;
****************************************************

你可能感兴趣的:(汇编查找程序简单实现)