Я пытаюсь написать Hello World на ассемблере GNU для Mac OS X, но это ошибка шины, прежде чем он сможет напечатать «Hello World».
.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, но это также ошибка шины.
Я подал отчет об ошибке в Apple из-за того, что его ассемблер GNU ужасно устарел (как 1.38). Вместо этого они сказали использовать clang.
Что я делаю неправильно?
Характеристики:
- ld64-134.9
- лязг 4.1
- Xкод 4.5
- Mac OS X 10.8.2
- Макбук Про 2009 г.