ASM中的字符串比较

时间:2014-04-05 08:52:12

标签: assembly asmx tasm

我是汇编程序的新手,我正在尝试进行简单的字符串比较。问题是它总是显示消息,说明字符串是相同的,即使它们不是。这是代码:

.model small
.data 
msg_incetermin db " ****************************$"
msg1 db " First string: $"
msg2 db " Second string: $"
msg3 db " str1 is ->$"
msgne db " strings are equal$"
msge db " strings are not equal$"
msg_banoutput db " -----------------------------$"
msg_termin db " end of program ...$"
sir1 db 80 dup(?),'$'
sir2 db 80 dup(?), '$'
newl db 13, 10,'$'

.code

; definitions -----------------
afis macro %text ; dispay string macro
lea dx, %text[1]
mov ah, 09h
int 21h
endm

; read string macro using linefeed 0ah
citire macro %str
mov %str[0], 75
lea dx, %str
mov ah, 0ah
int 21h
mov bl, %str[1]
mov %str[1], ''
add bl, 2
mov %str[bx], '$'
endm
;------------- definitions

mov ax, dgroup
mov ds, ax ;reserving source and destination memory segments
mov es, ax

afis newl ;intro messages
afis msg_incetermin
afis newl
afis msg1
citire sir1
afis newl
afis msg3
afis sir1
afis newl
afis newl
afis msg2
citire sir2
afis newl
afis msg3
afis sir2
afis newl
afis newl
afis msg_banoutput

lea si, sir1
lea di, sir2

cld
mov cx, 100
rep cmpsb
jne mes0

afis newl
afis msgne

jmp over1
mes0:
afis newl
afis msge
over1:


peste2:
afis newl ;exit messages
afis msg_incetermin
afis newl
afis newl
afis msg_termin
afis newl
mov ah, 4ch
int 21h
end  

有关如何在ASM中更好地编码,或者如何使该程序正常工作或更好地工作的任何建议都将受到欢迎。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

有几个问题:

  1. 你有一个硬编码的比较计数,所以即使字符串相等,你也要比较字符串末尾以外的数据,除非它们都是100字节长(它们不会是,因为你已经声明它们每个持有81个字节)。
  2. mov cx, 100
    

    您应该最多比较length_of_the_shortest_string个字节。如果字符串长度不同,则它们不相等,根本不需要比较它们的内容。


    2

    rep cmpsb
    

    不一定是个问题,因为汇编程序可能会为你处理这个问题,但这里使用的正确前缀是repe


    我也注意到很多名字很差的标签。例如,您已将"strings are equal"字符串命名为msgne,这意味着当字符串 n ot e <时,应该显示该消息/ b> QUAL 。然后有像mes0这样的标签,它们没有说明它们的用途。这样的事情使得代码不必要地难以读取/调试。