x86 сборка на Mac

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

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

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

9 ответов

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

    Тот же набор инструкций, те же чипы.

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

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

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

  4. После установки любой версии Xcode, предназначенной для компьютеров Mac на базе Intel, вы сможете написать сборочный код. Xcode-это набор инструментов, только один из которых-IDE, поэтому вам не нужно использовать его, если вы не хотите. (Тем не менее, если есть определенные вещи, которые вы находите неуклюжими, пожалуйста, подайте ошибку в Apple bug reporter — каждая ошибка идет в инженерию.) Кроме того, при установке Xcode будет установлен как ассемблер Netwide (NASM), так и ассемблер GNU (GAS); это позволит вам использовать любой синтаксис сборки, который вам наиболее удобен.

    Вы также захотите взглянуть на Руководства по компилятору и отладке, потому что они документируют соглашения о вызовах, используемые для различных архитектур, на которых работает Mac OS X, а также как работает двоичный формат и загрузчик. Соглашения о вызовах IA-32 (x86-32) могут немного отличаться от того, к чему вы привыкли.

    Еще одна вещь, чтобы иметь в виду, что интерфейс системных вызовов на Mac OS X отличается от того, что вы могли бы быть использованы для DOS/Windows, Linux или других вкусов BSD. Системные вызовы не считаются стабильным API на Mac OS X; вместо этого вы всегда проходите через libSystem. Это гарантирует, что вы пишете код, который переносим с одного выпуска ОС на следующий.

    Наконец, имейте в виду, что Mac OS X работает через довольно широкий спектр оборудования — все от 32-битного ядра одного через высокого класса четырехъядерного Xeon. При кодировании в сборке вы можете не оптимизировать так много, как вы думаете; то, что оптимально на одной машине, может быть пессимистичным на другой. Apple регулярно измеряет свои компиляторы и настраивает их выход с флагом оптимизации «-Os», чтобы быть достойным по всей своей линии, и есть обширные библиотеки векторной/матричной обработки, которые можно использовать для получения высокой производительности с вручную настроенными реализациями процессора.

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

  5. Как уже говорилось, Не используйте syscall. Вы можете использовать стандартные вызовы библиотеки C, но помните, что стек должен быть выровнен по 16 байтам на вызов функции ia32 Apple 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
    
  6. Не забывайте, что в отличие от Windows, все Unix системы должны иметь источник перед назначением в отличие от Windows

    На окнах ее:

    mov $source, %destination

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

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

    One-liner:

    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

  8. Запуск сборочного кода на Mac находится всего в 3 шагах от вас. Это может быть сделано с помощью XCODE, но лучше использовать инструмент командной строки NASM.
    Для моей легкости я уже установил Xcode, если у вас установлен Xcode его хорошо.

    Но вы можете сделать это и без XCode.

    просто следовать:

    1. Первая установка NASM с помощью Homebrew brew install nasm
    2. конвертировать.asm-файл в Obj-файл с помощью этой команды nasm -f macho64 myFile.asm
    3. Запустите файл Obj, чтобы просмотреть вывод с помощью команды 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