在 GAS x86 程序集中传递参数时遇到问题
I'm having a problem when passing a parameter in GAS x86 assembly
我正在尝试为 compare(int x, int y)
函数设置两个参数,但是当我传递它们时,我没有得到预期的结果,当我用 gdb 检查寄存器时,它们也没有它们似乎具有正确的值。
我这样设置参数并调用函数:
movl , (%esp)
movl , 8(%esp)
call compare
这是 returns 1 if x==y
和 0 if x!=y
的函数
compare:
pushl %ebp
movl %esp, %ebp
movl (%ebp), %eax
movl 8(%ebp), %edx
cmpl %eax, %edx
jne .L28
.L29:
movl , %eax
jmp .L30
.L28:
movl [=11=], %eax
jmp .L30
.L30:
popl %ebp
ret
出于测试目的,我将两个变量都设置为 10,但我得到的结果仍然是 0
让我们看看在compare()
中使用ebp
之前堆栈的状态是什么。
对compare()
的调用:
movl , (%esp)
movl , 8(%esp)
call compare
并在 compare
中推送 ebp
,即:
pushl %ebp
让堆栈保持以下状态:
Values Address
------------------
| 10 |
------------------ <- ESP+16
| undefined |
------------------ <- ESP+12
| 10 |
------------------ <- ESP+8
| return address |
------------------ <- ESP+4
| saved EBP |
------------------ <- ESP
在compare()
中的movl %esp, %ebp
之后,esp
和ebp
的值相同
movl (%ebp), %eax
movl 8(%ebp), %edx
看上图,这些指令应该是:
movl 8(%ebp), %eax
movl 16(%ebp), %edx
感谢@Jester 向我解释我的错误。
这是正确的实现:
movl , (%esp)
movl , 4(%esp)
call compare
函数:
compare:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
cmpl %eax, %edx
jne .L28
.L29:
movl , %eax
jmp .L30
.L28:
movl [=11=], %eax
jmp .L30
.L30:
popl %ebp
ret
我正在尝试为 compare(int x, int y)
函数设置两个参数,但是当我传递它们时,我没有得到预期的结果,当我用 gdb 检查寄存器时,它们也没有它们似乎具有正确的值。
我这样设置参数并调用函数:
movl , (%esp)
movl , 8(%esp)
call compare
这是 returns 1 if x==y
和 0 if x!=y
compare:
pushl %ebp
movl %esp, %ebp
movl (%ebp), %eax
movl 8(%ebp), %edx
cmpl %eax, %edx
jne .L28
.L29:
movl , %eax
jmp .L30
.L28:
movl [=11=], %eax
jmp .L30
.L30:
popl %ebp
ret
出于测试目的,我将两个变量都设置为 10,但我得到的结果仍然是 0
让我们看看在compare()
中使用ebp
之前堆栈的状态是什么。
对compare()
的调用:
movl , (%esp)
movl , 8(%esp)
call compare
并在 compare
中推送 ebp
,即:
pushl %ebp
让堆栈保持以下状态:
Values Address
------------------
| 10 |
------------------ <- ESP+16
| undefined |
------------------ <- ESP+12
| 10 |
------------------ <- ESP+8
| return address |
------------------ <- ESP+4
| saved EBP |
------------------ <- ESP
在compare()
中的movl %esp, %ebp
之后,esp
和ebp
的值相同
movl (%ebp), %eax
movl 8(%ebp), %edx
看上图,这些指令应该是:
movl 8(%ebp), %eax
movl 16(%ebp), %edx
感谢@Jester 向我解释我的错误。
这是正确的实现:
movl , (%esp)
movl , 4(%esp)
call compare
函数:
compare:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
cmpl %eax, %edx
jne .L28
.L29:
movl , %eax
jmp .L30
.L28:
movl [=11=], %eax
jmp .L30
.L30:
popl %ebp
ret