我目前正在攻读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组装
答案 0 :(得分:1)
您需要在函数末尾重置堆栈指针,显式或通过弹出一个寄存器来匹配您在函数开头推送的内容,否则当您返回时它将是一个无效的地址:
popl %ebp ; restore stack pointer to its original value
ret