X86 Сборка на Mac - программирование
Подтвердить что ты не робот

X86 Сборка на Mac

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

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

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

4b9b3361

Ответ 1

После установки любой версии 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 и заканчивая high-end четырехъядерным процессором Xeon. При кодировании в сборке вы можете не оптимизировать столько, сколько вы думаете; что оптимально на одной машине может быть pessimal на другой. Apple регулярно измеряет свои компиляторы и настраивает свою продукцию с флагом оптимизации "-O", чтобы быть достойным по всей своей линии, и есть обширные библиотеки векторной/матричной обработки, которые вы можете использовать для получения высокой производительности с настройками, специфичными для процессора, с ручной настройкой.

В сборку для развлечения отлично. Переход к сборке для скорости не для слабонервных в наши дни.

Ответ 2

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

Если вы не выровняете стек, ваша программа выйдет из строя в __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

Ответ 4

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

Для nasm:

-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

Однострочник:

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

Для более подробного объяснения я объяснил здесь свой Гитуб:

https://github.com/jaredsburrows/Assembly

Ответ 5

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

Это тот же набор команд; это те же чипы.

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

В Windows его:

mov $source,% destination

но на Mac это наоборот.