x86 Сборка на Mac
Кто-нибудь знает какие-либо хорошие инструменты (я ищу IDE) для записи сборки на Mac. Xcode для меня немного громоздкий.
Кроме того, на Intel Mac, можно ли использовать общий x86 asm? Или есть модифицированный набор команд? Любая информация о должности Intel.
Кроме того: я знаю, что в windowsх asm может запускаться в эмулированной среде, созданной ОС, чтобы позволить коду думать, что он работает на собственной специализированной машине. Обеспечивает ли OS X одно и то же?
- Изменение лицензии комментария заголовка по умолчанию в Xcode
- Создание NSData из NSString в Swift
- Можно ли ориентироваться на более старые версии iOS при использовании Xcode 4.2 и iOS 5 SDK?
- JSON Parsing in Swift 3
- Ошибка Xcode 6 при отправке архива
- Как создать задержку в Swift?
- Что такое Objective C ++?
- Как повернуть стрелку направления в конкретное место
- iAd в xcode 6 с Swift
- Xcode - установить средства командной строки
- Печать символа Unicode из переменной (swift)
- отключить авторотацию на одном UIViewController в iOS6
- Как уменьшить размер моего приложения iPhone?
После установки любой версии 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», чтобы быть достойным по всей своей линии, и есть обширные библиотеки векторной / матричной обработки, которые вы можете использовать для получения высокой производительности с настройками, специфичными для процессора, с ручной настройкой ,
Собираться в сборку для развлечения отлично. Переход к сборке для скорости в наши дни не для слабонервных.
Как указано выше, не используйте syscall. Однако вы можете использовать стандартные вызовы библиотеки C, но имейте в виду, что стек ДОЛЖЕН быть выровнен по 16 байт за каждый вызов функции IA32 в функции Apple.
Если вы не __dyld_misaligned_stack_error
стек, ваша программа выйдет из __dyld_misaligned_stack_error
в __dyld_misaligned_stack_error
при вызове в любую из библиотек или фреймворков.
Следующий fragment собирает и запускает в моей системе:
; 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
Для приятного пошагового внедрения x86 Mac можно найти http://peter.michaux.ca/articles/assembly-hello-world-for-os-x . Другие ссылки, которые я пробовал, имеют некоторые не-Mac-подводные камни.
Недавно я хотел узнать, как скомпилировать 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
Для 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
Для более подробного объяснения я объяснил здесь свой Гитуб:
Кроме того, на Intel Mac, можно ли использовать общий x86 asm? или есть модифицированный набор команд? Любые сведения о сборке Intel Mac помогают.
Это тот же набор команд; это одни и те же чипы.
Доступные функции зависят от вашего процессора. Apple использует тот же материал Intel, что и все остальные. Так что да, общий x86 должен быть хорошим (если вы не на PPC: D).
Что касается инструментов, я думаю, что ваш лучший выбор – хороший текстовый редактор, который «понимает» сборку.
Запуск кода сборки на Mac находится всего в 3 шагах от вас. Это можно сделать с помощью XCODE, но лучше использовать NASM Command Line Tool. Для 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
Забудьте об обнаружении IDE для записи / запуска / компиляции ассемблера на Mac. Но, помните, что mac – UNIX. См. http://asm.sourceforge.net/articles/linasm.html . Порядочный гид (хотя и короткий) для запуска ассемблера через GCC на Linux. Вы можете имитировать это. Mac использует процессоры Intel, поэтому вы хотите посмотреть на синтаксис Intel.
Не забывайте, что в отличие от Windows, все системы на базе Unix должны иметь источник до назначения в отличие от Windows
В Windows:
mov $ source,% destination
но на Mac это наоборот.