我正在尝试按照Mac OS X Montain Lion上的专业辅助语言一书。 在Google上,我在以下网址找到了适用于Mac OS X的端口:Assembly on MacOS X
使用Vim创建文件并使用GAS编译它: as -g -arch i386 -o cpuid.o cpuid.s 使用gcc链接代码: gcc -m32 -arch i386 -o cpuid cpuid.o
生成的可执行文件cpuid运行没有错误,但是如果我尝试用gdb调试它,那么它说程序退出时代码为044而不是程序正常退出。
试图找到一种方法让它正确退出我已经在C中创建了一个hello world示例并生成了汇编代码: gcc -Wall -03 -m32 -fno-PIC hello_pf.c -S -o hello_pf.s 生成的汇编代码如下:
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
leal L_.str, %eax
movl %eax, (%esp)
call _puts
movl $0, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
addl $24, %esp
popl %ebp
ret
.section __TEXT,__cstring,cstring_literals
L_.str:
.asciz "Hello world!\n"
.subsections_via_symbols
谢谢!
答案 0 :(得分:0)
首先,您需要了解调用约定中的寄存器用法,这是一个好的地方
http://www.agner.org/optimize/calling_conventions.pdf
你会发现在Mac OS X 64位上,返回“int”的函数的返回值 - 例如main() - 在%rax中。您似乎想要使用32位可执行文件,在这种情况下,返回值在%eax中。将寄存器归零的一种便捷方法是将其与自身进行异或,因此您应该将其添加到例程的末尾:
xorl %eax,%eax
这会将%eax设置为零,这将是您的退出代码。