两个字符的字符串比较失败

时间:2014-01-05 13:22:19

标签: string assembly x86 string-comparison masm

我有这个宏:

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

2 个答案:

答案 0 :(得分:1)

需要查看string1string2

的准确定义和内容

如果你是空字符串终止(即最后一个值是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字节位置。