如何比较 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
还有更多方法
我无法找到这个看似无关紧要且简单的问题的答案。我希望使用 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
还有更多方法