我是汇编程序的新手,我正在尝试进行简单的字符串比较。问题是它总是显示消息,说明字符串是相同的,即使它们不是。这是代码:
.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中更好地编码,或者如何使该程序正常工作或更好地工作的任何建议都将受到欢迎。
感谢您的时间。
答案 0 :(得分:0)
有几个问题:
mov cx, 100
您应该最多比较length_of_the_shortest_string
个字节。如果字符串长度不同,则它们不相等,根本不需要比较它们的内容。
2
rep cmpsb
不一定是个问题,因为汇编程序可能会为你处理这个问题,但这里使用的正确前缀是repe
。
我也注意到很多名字很差的标签。例如,您已将"strings are equal"
字符串命名为msgne
,这意味着当字符串 n ot e <时,应该显示该消息/ b> QUAL 。然后有像mes0
这样的标签,它们没有说明它们的用途。这样的事情使得代码不必要地难以读取/调试。