我很难理解为什么这段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
之前,程序就可以正常工作。但是为什么它在原始形式下会失败呢?
gcc -S -O3 ...
编译它,然后使用生成的.s
文件作为自己代码的基础。这样你就可以免费获得所有堆栈对齐和其他样板代码。 - Paul R