Сборка x86 на Mac

Кто-нибудь знает какие-нибудь хорошие инструменты (ищу IDE) для написания сборки на Mac. Xcode для меня немного громоздок.

Кроме того, на компьютерах Intel Mac можно использовать общий ассемблер x86? Или есть доработанный набор инструкций? Любая информация о посте Intel.

Также: я знаю, что в Windows asm может работать в эмулируемой среде, созданной ОС, чтобы код думал, что он работает на его собственном выделенном компьютере. Предоставляет ли OS X то же самое?

Ответов (9)

Решение

После установки любой версии Xcode, предназначенной для компьютеров Mac на базе Intel, вы сможете писать код сборки. Xcode - это набор инструментов, только одним из которых является IDE, поэтому вам не нужно использовать его, если вы не хотите. (Тем не менее, если есть определенные вещи, которые вы считаете неуклюжими, сообщите об ошибке репортеру об ошибках Apple - каждая ошибка идет на разработку.) Кроме того, при установке Xcode будут установлены как Netwide Assembler (NASM), так и GNU Assembler (GAS); это позволит вам использовать любой синтаксис сборки, который вам удобнее всего.

Вы также захотите взглянуть на руководства по компилятору и отладке , потому что они документируют соглашения о вызовах, используемые для различных архитектур, на которых работает Mac OS X, а также то, как работают двоичный формат и загрузчик. В частности, соглашения о вызовах IA-32 (x86-32) могут немного отличаться от того, к чему вы привыкли.

Также следует иметь в виду, что интерфейс системного вызова в Mac OS X отличается от того, к чему вы, возможно, привыкли в DOS / Windows, Linux или других разновидностях BSD. Системные вызовы не считаются стабильным API в Mac OS X; вместо этого вы всегда используете libSystem. Это гарантирует, что вы будете писать код, переносимый с одной версии ОС на другую.

Наконец, имейте в виду, что Mac OS X работает с довольно широким спектром оборудования - от 32-битного Core Single до высокопроизводительного четырехъядерного Xeon. Кодируя на ассемблере, вы, возможно, не оптимизируете столько, сколько думаете; то, что оптимально на одной машине, может быть пессимально на другой. Apple регулярно измеряет свои компиляторы и настраивает их вывод с помощью флага оптимизации «-Os», чтобы быть достойным по всей линейке, и есть обширные библиотеки векторной / матричной обработки, которые вы можете использовать для получения высокой производительности с помощью вручную настроенных реализаций для конкретного процессора. .

Ходить на сборку ради удовольствия - это здорово. В наши дни собираться на сборку ради скорости не для слабонервных.

Хорошее пошаговое введение для Mac x86 см. http://peter.michaux.ca/articles/assembly-hello-world-for-os-x . У других ссылок, которые я пробовал, есть некоторые подводные камни, отличные от Mac.

Недавно я хотел узнать, как скомпилировать Intel x86 на Mac OS X:

Для назм:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho

Для ld:

-arch i386 - specify architecture (32 bit assembly)
-macosx_version_min 10.6 (Mac OSX - complains about default specification)
-no_pie (Mac OSX - removes ld warning)
-e main - specify main symbol name (Mac OSX - default is start)
-o hello.o - outfile

Для Shell:

./hello.o - execution

Один лайнер:

nasm -o hello.tmp -f macho hello.s && ld -arch i386 -macosx_version_min 10.6 -no_pie -e _main -o hello.o hello.tmp && ./hello.o

Позвольте мне знать, если это помогает!

Я написал, как это сделать, в своем блоге здесь:

http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html

Для более подробного объяснения я объяснил здесь на своем Github:

https://github.com/jaredsburrows/Assembly

Кроме того, на компьютерах Intel Mac можно использовать общий ассемблер x86? или есть доработанный набор инструкций? Любая информация о пост-сборке Intel Mac поможет.

Это тот же набор инструкций; это те же фишки.

Забудьте о поиске IDE для написания / запуска / компиляции ассемблера на Mac. Но помните, что Mac - это UNIX. См. http://asm.sourceforge.net/articles/linasm.html . Достойное руководство (хотя и краткое) по запуску ассемблера через GCC в Linux. Вы можете имитировать это. В компьютерах Mac используются чипы Intel, поэтому вам нужно изучить синтаксис Intel.

Доступные для использования функции зависят от вашего процессора. Apple использует те же продукты Intel, что и все остальные. Так что да, общий x86 должен подойти (при условии, что вы не используете PPC: D).

Что касается инструментов, я думаю, ваш лучший выбор - это хороший текстовый редактор, который «понимает» сборку.

Как было сказано ранее, не используйте системные вызовы. Тем не менее, вы можете использовать стандартные вызовы библиотеки C, но имейте в виду, что стек ДОЛЖЕН быть выровнен по 16 байт для каждого вызова функции Apple IA32 ABI .

Если вы не выровняете стек, ваша программа выйдет из строя, __dyld_misaligned_stack_error когда вы вызовете любую из библиотек или фреймворков.

Следующий фрагмент кода собирается и запускается в моей системе:

; File: hello.asm
; Build: nasm -f macho hello.asm && gcc -o hello hello.o

SECTION .rodata
hello.msg db 'Hello, World!',0x0a,0x00

SECTION .text

extern _printf ; could also use _puts...
GLOBAL _main

; aligns esp to 16 bytes in preparation for calling a C library function
; arg is number of bytes to pad for function arguments, this should be a multiple of 16
; unless you are using push/pop to load args
%macro clib_prolog 1
    mov ebx, esp        ; remember current esp
    and esp, 0xFFFFFFF0 ; align to next 16 byte boundary (could be zero offset!)
    sub esp, 12         ; skip ahead 12 so we can store original esp
    push ebx            ; store esp (16 bytes aligned again)
    sub esp, %1         ; pad for arguments (make conditional?)
%endmacro

; arg must match most recent call to clib_prolog
%macro clib_epilog 1
    add esp, %1         ; remove arg padding
    pop ebx             ; get original esp
    mov esp, ebx        ; restore
%endmacro

_main:
    ; set up stack frame
    push ebp
    mov ebp, esp
    push ebx

    clib_prolog 16
    mov dword [esp], hello.msg
    call _printf
    ; can make more clib calls here...
    clib_epilog 16

    ; tear down stack frame
    pop ebx
    mov esp, ebp
    pop ebp
    mov eax, 0          ; set return code
    ret

Не забывайте, что в отличие от Windows, все системы на базе Unix должны иметь исходный код до назначения, в отличие от Windows.

В Windows это:

mov $ source,% destination

но на Mac все наоборот.

Запуск кода сборки на Mac находится всего в 3 шагах от вас. Это можно сделать с помощью XCODE, но лучше использовать инструмент командной строки NASM. Для удобства я уже установил Xcode, если у вас установлен Xcode, все хорошо.

Но вы можете сделать это и без XCode.

Просто следуйте:

  1. Сначала установите NASM с помощью Homebrew brew install nasm
  2. преобразовать файл .asm в файл Obj с помощью этой команды nasm -f macho64 myFile.asm
  3. Запустите файл Obj, чтобы увидеть OutPut с помощью команды ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64

Простой текстовый файл с именем myFile.asm написан ниже для вашего удобства.

global start
section .text

start:
    mov     rax, 0x2000004 ; write
    mov     rdi, 1 ; stdout
    mov     rsi, msg
    mov     rdx, msg.len
    syscall

    mov     rax, 0x2000001 ; exit
    mov     rdi, 0
    syscall

section .data

msg:    db      "Assalam O Alaikum Dear", 10
.len:   equ     $ - msg