我正在尝试在 Mac OS X 的 GNU 汇编器中编写 Hello World,但在它可以打印“Hello World”之前出现总线错误。
你好.s:
.global start
.data
.equ stdout, 1
.equ sys_write, 4
.equ sys_exit, 1
.equ kernel, 0x80
msg: .asciz "Hello World!\n"
.equ len, .-msg
.text
start:
push $len
push $msg
push $stdout
mov $sys_write, %eax
sub $4, %esp
int $kernel
add $4 + $4 * $3, %esp
push $0
mov $sys_exit, %eax
sub $4, %esp
int $kernel
痕迹:
$ clang -c -o hello.o hello.s
$ ld -o hello -macosx_version_min 10.6 hello.o
$ ./hello
Bus error: 10
$ gdb hello
(gdb) run
Starting program: /Users/andrew/Desktop/src/mcandre/gas/hello/freebsd/hello
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x0000000000002000
0x0000000000002000 in msg ()
我的代码基于几件事:
我采用了 NASM / Mac OS X 的语义和 Gas / Linux 的语法。
我还尝试了 GNU Assembler Wikipedia page上的示例程序,但它也出现了总线错误。
我向 Apple 提交了一份错误报告,因为它的 GNU 汇编器非常过时(如 1.38)。他们说改用clang。
我究竟做错了什么?
眼镜:
- ld64-134.9
- 铿锵声4.1
- Xcode 4.5
- Mac OS X 10.8.2
- MacBook Pro 2009