注册 登录
编程论坛 汇编论坛

汇编语言的问题(温柔小刀的问题)

nuww7 发布于 2008-08-28 09:04, 1395 次点击
实现两个字符串的比较
子程序描述:
;子程序STRCMP
;功能:比较两个字符串
;入口参数:DS:SI=字符串1的首地址  
           ES:DI=字符串2的首地址
;出口参数:AX=0,表示两个字符串相同
;说明:设字符串均以0为结束标志

STRCMP  PROC
              CLD
           PUSH DI
          XOR AL,AL
           MOV  CX,0FFFFH
NEXT:SCASB
           JNZ  NEXT
         NOT  CX
           POP  DI
          REPZ  CMPSB
           MOV  AL,[SI-1]
           MOV BL,ES:[DI-1]
             XOR AH,AH
              MOV  BH,AH
             SUB AX,BX
             RET
STRCMP  ENDP
我的问题:
        XOR AL,AL
           MOV  CX,0FFFFH
NEXT:SCASB
           JNZ  NEXT
        NOT  CX
这几个语句的作用是什么?老师说第一句是先测试一个字符串长度,NOT  CX
这句是取得重复的次数,不能理解,这是怎么取得的?SCASB的作用是AL减去DI所指向的内存中存储的字符
的ASCII码,XOR AL,AL后,AL=0,字符串是以0结尾的,这样就能扫描完字符串,这是可以理解的,可是关
于字符串的长度的计数,也就是取得重复次数怎么用NOT  CX。现在假设重复了5次,CX<----CX-5,即0FFFFH
减去5,这NOT CX是取得重复次数,真不能理解。
3 回复
#2
ONEPROBLEM2008-08-28 11:15
我刚学的,跟你探讨一下吧:
两个字符串的比较,有可能两者是不等长的,即,串1可能是10个字符;而串2是8个字符.所以,CX的值是不好设置的.
你的程序处理方法就是:
MOV  CX,0FFFFH 设置CX为最大值,执行 NOT  CX 即FFFF取反后,CX = 0
而REPZ  CMPSB 中的CMPSB指令的作用是先比较一个字符,然后将CX-1.于是,CX-1 (0-1的补码)后CX中的值变成了FFFF ,再用REPZ来判断,CX是不等于0了,于是循环继续!(其实它就是先让CX变成最大,有足够的循环次数.)
那循环的真正次数由谁来确定呢?就是REPZ  !!!尽管CX不等于0了,但当比较的两个字符不相等时,循环自然终止.
#3
srl99732008-09-10 09:50
XOR AL,AL    ;将AL置0,找串结束标志0
           MOV  CX,0FFFFH  ;将CX置-1为求串长度准备
NEXT:   SCASB        
           JNZ  NEXT      ;找到0退出
        NOT  CX         ;求串长度
 在SCASB 前少了一语句DEC CX,这样这个循环才是取目的串的长度。

现在假设重复了5次,CX<----CX-5,即0FFFFH-5=0fffaH=1111 1111 1111 1010B    求反后就 是0000 0000 0000 0101B=5
#4
随心2008-09-10 12:57
学习了
1