【问题标题】:I'm having a problem when passing a parameter in GAS x86 assembly在 GAS x86 程序集中传递参数时遇到问题
【发布时间】: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) 是保存的ebp4(%ebp) 是返回地址,8(%ebp) 是第一个参数,12(%ebp) 是第二个。跨度>
  • 成功了,谢谢!

标签: assembly x86 gnu-assembler


【解决方案1】:

让我们看看ebpcompare()中使用之前堆栈的状态是什么。

拨打compare():

movl    $10, (%esp)
movl    $10, 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

【讨论】:

  • 感谢您的图表!我最终做到了这一点,但改变了我的数字
【解决方案2】:

感谢 @Jester 向我解释我的错误。

这是正确的实现:

movl    $10, (%esp)
movl    $10, 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    $1, %eax
    jmp .L30
.L28:
    movl    $0, %eax
    jmp .L30
.L30:
    popl    %ebp
    ret

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多