如何比较 GAS 组件架构中的值?

How does one compare values in GAS assembly architecture?

我无法找到这个看似无关紧要且简单的问题的答案。我希望使用 cmp 或其衍生物之一(cmpl、cmpb 等)来比较 GAS 汇编程序中的两个值。问题是,当我 运行 本应得出不同结果的多重比较时,结果却相同。我相信这涉及到我对数据如何与 cmp 操作进行比较的误解。

情况如下:

我有一个填充变量来接受这样的输入,用一个 equ 来保存大小:

buff:    .fill    20
         .equ     bufLen, .-buff

然后我把bufLen变量放在一个寄存器里,比较值放在另一个寄存器里:

         movl     $bufLen, %eax
         movl     [=11=]x03, %ebx

最后,我进行比较,如果比较相等,则跳转到另一行:

         cmpl     %eax, %ebx
         je       anotherplace

但是,当我比较长度为 2 和 4 的输入时,它们都小于(为了快速调试,我将 je 更改为 jl)。任何人都可以告诉我我做错了什么或指出一个我错过的问题可能会告诉我我是如何搞砸的吗?

提醒一下,这是GAS组装架构。

非常感谢所有帮助。

正如我在对我的原始问题的评论中发现的那样,问题是我没有意识到 bufLen 的长度为 20,正如 buff 变量中所定义的那样。因此,我比较的所有较低值都返回为小于 20。

根据评论,我向您展示了一些获取 Linux 中以零结尾的字符串 (.asciz) 长度的方法:

witch.s:

.data

witches: .asciz "Double, double toil and trouble; Fire burn, and cauldron bubble"
format0: .asciz "%s\n"
format1: .asciz "Return of printf: %u\n"
format2: .asciz "Return of strlen: %u\n"
format3: .asciz "Return of repne scasb: %u\n"

.text
.global main
main:

    push $witches
    push $format0
    call printf         # returns in EAX the amount of printed chars (+ \n!)
    add , %esp

    push %eax
    push $format1
    call printf
    add , %esp

    push $witches
    call strlen         # returns in EAX the length of the string
    add , %esp

    push %eax
    push $format2
    call printf
    add , %esp

    mov $witches, %edi
    xor %al, %al
    xor %ecx, %ecx
    dec %ecx
    repne scasb
    neg %ecx            # returns in ECX the length of the string + 2

    push %ecx
    push $format3
    call printf
    add , %esp

    mov [=10=], %eax        # return 0;
    ret

编译&运行:

gcc -m32 witch.s
./a.out

还有更多方法