在 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之后,espebp的值相同

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