проблемы с запуском Hello World / gas / Mac OS X

Я пытаюсь написать Hello World на ассемблере GNU для Mac OS X, но это ошибка шины, прежде чем он сможет напечатать «Hello World».

hello.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, но это также ошибка шины.

Я подал отчет об ошибке в Apple из-за того, что его ассемблер GNU ужасно устарел (как 1.38). Вместо этого они сказали использовать clang.

Что я делаю неправильно?

Характеристики:

  • ld64-134.9
  • лязг 4.1
  • Xкод 4.5
  • Mac OS X 10.8.2
  • Макбук Про 2009 г.

person mcandre    schedule 15.10.2012    source источник


Ответы (1)


В ответ на то, что вы сделали неправильно, я не уверен. Прошло некоторое время с тех пор, как я использовал сборку, но clang не любил статусы .equ на моем Mac. Когда я их заменил, все заработало. (Честно говоря, я предпочитаю NASM, хотя использую тот, что от macports.)

Я создал простой файл .s, который будет компилироваться с помощью clang, у меня была одна проблема с длиной строки.. (возможно, это ошибка?), где я сохраняю длину в $len, но когда я использую $len, это не работает .. но использование жестко закодированного номера делает.

Я скомпилировал код с помощью:

clang -c -o hello.o hello.s -arch i386
ld -o hello -macosx_version_min 10.6 -arch i386 hello.o
./hello

привет.с:

/* defines */
.set sys_exit, 1
.set sys_write, 4
.set stdout, 1
.set kernel, 0x80

// TEXT SECTION
.text

/* write function */
.macro write str, strSize
    // length of string
    push \strSize
    // the string
    push \str
    // to file descriptor
    push $stdout
    // what we want to call
    movl $sys_write, %eax
    // call the kernal
    call _syscall
    // free the stack
    addl $12, %esp
.endm

/* define main function */
.globl start

/* impl. main function */
start:

    // write(string, long)
    // if I use $len i get a bunch of letters
    write $msg, $14 //$len

    // exit(0)
    // if i print out $len it is 14
    push $0 //$len
    movl $sys_exit, %eax
    call _syscall

/* call kernal 
 * 
 * so you don't have to do sub $4, %esp
 */
_syscall:
    int $kernel
    ret

// DATA SECTION
.data
    /* our string */
    msg: .string "Hello World!\n"
    // using len: .long $14 causes the same issue as . - msg
    // where the string does not end at 14
    // perhaps someone else knows why..
    len: .long . - msg

Надеюсь, это поможет.

person Forrest Porter    schedule 15.10.2012
comment
ну, я пытался использовать $-msg, а затем .-msg, но если вы хотите иметь среду для сборки на * nix, я могу добавить к своему ответу рабочий пример, который, как мне кажется, проще сделать; через MacPorts и NASM. - person Forrest Porter; 16.10.2012
comment
@mcandre Если вы хотите увидеть, как я настроил свою среду сборки, или хотите увидеть, как создать универсальный двоичный файл для Mac, я загрузил zip-файл, весь код находится в открытом доступе ссылка - person Forrest Porter; 17.10.2012