【发布时间】:2018-12-03 01:27:47
【问题描述】:
我正在尝试为compare(int x, int y) 函数设置两个参数,但是当我将它们传入时,我没有得到预期的结果,并且当我使用 gdb 检查寄存器时,它们似乎没有正确的值。
我这样设置参数并调用函数:
movl $10, (%esp)
movl $10, 8(%esp)
call compare
这是一个函数,如果x==y返回1,如果x!=y返回0
compare:
pushl %ebp
movl %esp, %ebp
movl (%ebp), %eax
movl 8(%ebp), %edx
cmpl %eax, %edx
jne .L28
.L29:
movl $1, %eax
jmp .L30
.L28:
movl $0, %eax
jmp .L30
.L30:
popl %ebp
ret
出于测试目的,我将两个变量都设置为 10,但我仍然得到 0 的结果
【问题讨论】:
-
在调用者中,第二个参数应该是
4(%esp)。在被调用者中,如果像你这样使用帧指针,(%ebp)是保存的ebp,4(%ebp)是返回地址,8(%ebp)是第一个参数,12(%ebp)是第二个。跨度> -
成功了,谢谢!
标签: assembly x86 gnu-assembler