我有这个宏:
compare macro string1, string2
local equal, notequal
mov eax, 1
mov ecx, 4
lea esi, offset string1
lea edi, offset string2
cld
repz cmpsb
je equal
jmp notequal
equal: mov eax, 0
notequal:
endm;
如果string1是“A + B”而string2是“A + B”,那么一切都很好,而eax是0。 也适用于“A-B”或“AxB”..
为什么这不能用于比较“AB”和“AB”?
PS。我正在使用MASM,我更喜欢不使用C / C ++函数
LATER EDIT:
string1 db "AB"
operation db 6 dup(0)
其中operation是string2,我从键盘读取它 使用这个宏:
read macro var, typee
push offset var
push offset typee
call scanf
add esp, 8
mov esi, eax
endm
其中var实际上是操作而typee是a =>字符串db“%s”,0
答案 0 :(得分:1)
需要查看string1
和string2
。
如果你是空字符串终止(即最后一个值是0字节),那么原因是在A?B
情况下,你正在比较4个字符,包括最后一个(零)字节。如果你使用AB
那么第三个可能是零,但第四个是什么?它必须匹配。
编辑以指定可能的治愈方法
string1 db "AB"
db 2 dup(0) ;to fill out string1 to 4 bytes
operation db 6 dup(0)
答案 1 :(得分:0)
repz cmpsb
指令将告诉您字符串中的字符数等于ecx
中的字节数。
如果比较一个字符串与ecx
中指示的大小相同,那么你的代码可以工作,但是如果字符串更短,就像你的第二个例子一样,这意味着指令将循环到第三个字节(这可能是\0
来终止字符串)然后可能会打到一个不再相等的字节,因此循环会被破坏,而你的分支也不会被占用。
因此,如果您想比较任意大小的字符串,您可以将长度放在ecx
中,并且只有在比较后ecx == 0
时它们才相等。
如果您有不同长度的字符串,那么您已经知道它们不能相等。
实际上,第四个字节碰巧不匹配对你有好处,因为它是未定义的,并且你会认为你的代码工作正常,如果碰巧在最后的那个意外的\0
字节位置。