Сборка 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 здесь:
Запуск кода сборки на Mac находится всего в 3 шагах от вас. Это можно сделать с помощью XCODE, но лучше использовать инструмент командной строки NASM. Для My Ease я уже установил Xcode, если у вас установлен Xcode, это хорошо.
Но Вы можете сделать это и без XCode.
Просто следуйте:
- Сначала установите NASM, используя Homebrew
brew install nasm
- преобразуйте файл.asm в файл Obj, используя эту команду
nasm -f macho64 myFile.asm
- Запустите файл 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 все наоборот.