newplan

阿基米德在洗澡時發現浮力原理,高興得來不及穿㆖褲子,跑到街㆖大喊:Eureka(我找到了)。
posts - 39, comments - 26, trackbacks - 0, articles - 4
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
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
;
****************************************************

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理