我正在尝试比较2个字符串,看看它们在汇编时是否相等。区分大小写。它们是从cpp包装器传入的。以下是我到目前为止的情况:
我在esi中存储了一个字符串,另一个在edi:
中LOOP:
mov al, [esi + edx*4]
mov bl, [edi + edx*4]
sub al, bl
INC edx
je LOOP
jmp END_LOOP ; if it's not equal, do some stuff at the end
END_LOOP:
我做错了什么?它是如何知道我何时在char数组的末尾?
答案 0 :(得分:4)
由于这些字符串是C ++字符串,并且我猜它们是由char
而不是宽字符组成的,因此每个字符的大小都是一个字节,所以你不应该将索引寄存器{{1另外,在edx
指令之前,你不能在之前之前增加edx
,因为只有跳转才会将edx提升到零。
最后,字符串以0字节结尾。因此,您正在寻找零je
或al
来知道何时停止循环。
您可以按以下方式修改代码:
bl
但是我建议在x86中搜索字符串比较。有 xor edx, edx ; make sure edx is 0 to start with
LOOP:
mov al, [esi + edx]
mov bl, [edi + edx]
inc edx ; prepare for next char
cmp al, bl ; compare two current characters
jne DIFFERENT ; not equal, get out, you are DONE!
cmp al, 0 ; equal so far, are you at the end?
je SAME ; got to end of both strings, you're good, get out
jmp LOOP ; okay well they agree so far, go to next char
DIFFERENT:
; Do what you need to do for the strings being different
;
;
jmp DONE
SAME:
; Do what you need to do for the strings being the same
;
;
DONE:
条指令。如果您愿意,甚至可以安排拨打cmps
功能。有几种方法可以解决这个问题。
答案 1 :(得分:2)
嗯...为什么“edx * 4”?看起来你只会比较每四个字符。 “sub”将标志设置为与“cmp”相同。不同之处在于“sub”会覆盖al,而“cmp”只会设置标记,只留下两个寄存器。要么适合你。
然后你“inc edx”。这会再次设置标志,并且您希望使用标志来查看字符串是否相等! “inc”是一种“有趣”的指令,因为它设置了大部分标志,但仅留下进位标志。这对你没有帮助。需要完成“inc”,但不能在cmp / sub和条件跳转之间完成!
除非我弄错了,否则C将“string”定义为一个以零结尾的char数组,所以假设你的字符串是零终止的可能是安全的。另一种方法是将长度作为另一个参数传递。
Ray刚刚发布了一些可以解决问题的好代码,所以我会停止......
最佳, 弗兰克