首页 > 解决方案 > 在 GAS x86 程序集中传递参数时遇到问题

问题描述

我正在尝试为该compare(int x, int y)函数设置两个参数,但是当我将它们传入时,我没有得到预期的结果,并且当我使用 gdb 检查寄存器时,它们似乎没有正确的值。

我设置了参数并像这样调用函数:

movl    $10, (%esp)
movl    $10, 8(%esp)
call    compare

这是返回 1 ifx==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    $1, %eax
    jmp .L30
.L28:
    movl    $0, %eax
    jmp .L30
.L30:
    popl    %ebp
    ret

我将两个变量都设置为 10 用于测试目的,但我仍然得到 0 的结果

标签: assemblyx86gnu-assembler

解决方案


让我们看看在ebp使用之前堆栈的状态是什么compare()

调用compare()

movl    $10, (%esp)
movl    $10, 8(%esp)
call    compare

并推ebpcompare,即:

pushl   %ebp

使堆栈保持以下状态:

      Values           Address

------------------
|      10        |
------------------  <- ESP+16
|   undefined    |
------------------  <- ESP+12
|      10        |
------------------  <- ESP+8
| return address |
------------------  <- ESP+4
|   saved EBP    |
------------------  <- ESP

movl %esp, %ebpin之后compare(),两者espebp具有相同的值。

movl (%ebp), %eax
movl  8(%ebp), %edx

查看上图,这些说明应该是:

movl   8(%ebp), %eax
movl  16(%ebp), %edx

推荐阅读