【发布时间】:2015-01-09 02:21:50
【问题描述】:
我很难理解为什么这个 x86 汇编代码在 OSX 上用 gcc 4.2.1 (llvm) 编译得很好,但是在运行可执行文件时会出现分段错误:
.globl _main
_main:
push %rbp
mov %rsp, %rbp
mov $1, %rbx
push %rbx
lea L_.str0(%rip), %rdi
mov %rbx, %rsi
call _printf
pop %rbx
pop %rbp
ret
.section __TEXT,__cstring,cstring_literals
L_.str0:
.asciz "%d \000"
我观察到如果pop %rbx 行移动到call _printf 之前,那么程序可以正常运行。但是为什么它会以原来的形式失败呢?
【问题讨论】:
-
你需要对齐堆栈...
-
@Macmade 是正确的,我相信 - 我编译并运行了您的代码,崩溃日志甚至说这是堆栈未对齐(不是 16 字节对齐)。
-
@PaulR - 谢谢。有没有办法通过指令来做到这一点?还是我必须撒上代码才能手动对齐?
-
同样的问题...请参阅我刚才提到的帖子上的答案,以了解如何做到这一点。