Сборка x86 на Mac

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

Кроме того, на Intel Mac, могу ли я использовать общий x86 asm? Или есть модифицированный набор инструкций? Любая информация о посте 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", чтобы он соответствовал всей линейке, и есть обширные библиотеки векторной / матричной обработки, которые вы можете использовать для достижения высокой производительности с помощью ручных настроек, специфичных для CPU.,

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

Как указано выше, не используйте syscall. Вы можете использовать стандартные вызовы библиотеки 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

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

Для носа:

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

Для лд:

-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

Запуск кода сборки на Mac находится всего в 3 шагах от вас. Это можно сделать с помощью XCODE, но лучше использовать инструмент командной строки NASM. Для My Ease я уже установил 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

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

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

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

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

Что касается инструментов, я думаю, что вам лучше всего выбрать хороший текстовый редактор, который "понимает" сборку.

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

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

На Windows его:

mov $ source,% destination

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

Другие вопросы по тегам