Вопрос

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

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

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

Это было полезно?

Решение

После установки любой версии 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», чтобы они были приличными во всей своей линейке, а также существуют обширные библиотеки векторной / матричной обработки, которые вы можете использовать для достижения высокой производительности с помощью вручную настроенных реализаций для конкретного процессора. .

Пойти на собрание ради развлечения — это здорово.В наши дни идти на ассамблею ради скорости — занятие не для слабонервных.

Другие советы

Как говорилось ранее, не используйте системный вызов.Однако вы можете использовать стандартные вызовы библиотеки 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

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

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

Для Шелла:

./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 здесь:

https://github.com/jaredsburrows/Assembly

Запуск ассемблерного кода на 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

Кроме того, на компьютерах Intel Mac я могу использовать универсальный asm x86?или есть модифицированный набор инструкций?Любая информация о сборке после 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 все наоборот.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top