比较x86程序集中的字符数组

时间:2012-07-26 06:38:30

标签: assembly x86

我正在尝试比较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数组的末尾?

2 个答案:

答案 0 :(得分:4)

由于这些字符串是C ++字符串,并且我猜它们是由char而不是宽字符组成的,因此每个字符的大小都是一个字节,所以你不应该将索引寄存器{{1另外,在edx指令之前,你不能在之前之前增加edx,因为只有跳转才会将edx提升到零。

最后,字符串以0字节结尾。因此,您正在寻找零jeal来知道何时停止循环。

您可以按以下方式修改代码:

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刚刚发布了一些可以解决问题的好代码,所以我会停止......

最佳, 弗兰克