保存基指针时0xbffff8a8:aam $ -0x8错误

时间:2014-04-04 07:44:44

标签: macos assembly x86

我目前正在攻读Uni的微电子和装配编程入门课程。在每个函数的开头,我通过将调用者的基本指针推入堆栈来保存它。鉴于以下功能,我收到错误:

        .globl my_func
        .globl _my_func

my_func:
_my_func:
    pushl   %ebp
    movl    %esp,%ebp

    movl    4(%esp),%ebx

    subl    $1,%ebx
    movl    %ebx,%eax
    ret
  

0xbffff8a8:aam $ -0x8< -EXC_BAD_ACCESS(code = 2,address = 0xbffff8a8)

我已经发现这是一个记忆异常,我只是不明白为什么会被抛出。当我跳过函数中的前两个指令(基本指针保存)时,该函数运行良好。在你指出它之前 - 是的,我知道这个功能是毫无意义和缓慢的,我只是想了解指令的工作原理,以及如何使用堆栈和寄存器。

我在使用LLVM5.1的OSX10.9的Intel Mac上为IA32组装

1 个答案:

答案 0 :(得分:1)

您需要在函数末尾重置堆栈指针,显式或通过弹出一个寄存器来匹配您在函数开头推送的内容,否则当您返回时它将是一个无效的地址:

popl %ebp    ; restore stack pointer to its original value
ret