Сборка x86 на Mac - PullRequest
       112

Сборка x86 на Mac

53 голосов
/ 08 августа 2008

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

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

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

Ответы [ 9 ]

69 голосов
/ 08 августа 2008

После установки любой версии 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. .

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

29 голосов
/ 10 декабря 2008

Как указано выше, не используйте 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
8 голосов
/ 15 июля 2011

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

7 голосов
/ 23 июля 2013

Недавно я хотел научиться компилировать 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

Для оболочки:

./hello.o - execution

One-вкладыш:

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

5 голосов
/ 25 января 2018

Запуск кода сборки на 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
4 голосов
/ 08 августа 2008

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

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

1 голос
/ 08 августа 2008

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

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

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

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

В Windows это:

mov $ source,% destination

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

0 голосов
/ 08 августа 2008

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

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