ассемблер в ос х - PullRequest
       1

ассемблер в ос х

7 голосов
/ 09 августа 2011

Я использовал ассемблер для изучения программирования на ассемблере в Linux.Недавно я приобрел Mac, на котором int 0x80 не работает (недопустимая инструкция).

Так что просто хотел узнать, есть ли хороший справочник (книга / веб-страница), который дает различия между стандартными сборками Unix и сборкой Дарвина.

Ответы [ 3 ]

4 голосов
/ 09 августа 2011

В практических целях этот ответ показывает , как скомпилировать приложение hello world с использованием nasm в OSX .

Этот код может бытьскомпилирован для linux как есть, но команда cmd-line для его компиляции, вероятно, будет отличаться:

section .text

global mystart                ; make the main function externally visible

mystart:

; 1 print "hello, world"

    ; 1a prepare the arguments for the system call to write
    push dword mylen          ; message length                           
    push dword mymsg          ; message to write
    push dword 1              ; file descriptor value

    ; 1b make the system call to write
    mov eax, 0x4              ; system call number for write
    sub esp, 4                ; OS X (and BSD) system calls needs "extra space" on stack
    int 0x80                  ; make the actual system call

    ; 1c clean up the stack
    add esp, 16               ; 3 args * 4 bytes/arg + 4 bytes extra space = 16 bytes

; 2 exit the program

    ; 2a prepare the argument for the sys call to exit
    push dword 0              ; exit status returned to the operating system

    ; 2b make the call to sys call to exit
    mov eax, 0x1              ; system call number for exit
    sub esp, 4                ; OS X (and BSD) system calls needs "extra space" on stack
    int 0x80                  ; make the system call

    ; 2c no need to clean up the stack because no code here would executed: already exited

section .data

  mymsg db "hello, world", 0xa  ; string with a carriage-return
  mylen equ $-mymsg             ; string length in bytes

Сборка источника (hello.nasm) в объектный файл:

nasm -f macho hello.nasm

Ссылка для создания исполняемого файла:

ld -o hello -e mystart hello.o
1 голос
/ 02 марта 2014

Этот вопрос, вероятно, поможет: Список и документация для системных вызовов для ядра XNU в OSX .

К сожалению, похоже, что в упомянутой книге есть единственный способ выяснить,,Что касается int 0x80, я сомневаюсь, что он будет работать, потому что это довольно специфичный для Linux API, встроенный прямо в ядро.

Компромисс, который я делаю при работе на незнакомой ОС, состоит в том, чтобы просто использовать вызовы libc, ноЯ понимаю, что даже это может быть слишком высоким уровнем, если вы просто хотите учиться.

0 голосов
/ 09 августа 2011

вы можете опубликовать свой код и как вы скомпилировали? (Есть много способов выявить недопустимые ошибки инструкций)

OSX выбрал стиль передачи аргументов в стиле bsd, поэтому вы должны действовать немного иначе.

Я недавно это отметил: http://www.freebsd.org/doc/en/books/developers-handbook/book.html#X86-SYSTEM-CALLS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...