Frage

Kennt jemand gute Tools (ich suche IDEs), um Assembly auf dem Mac zu schreiben?Xcode ist für mich etwas umständlich.

Kann ich auf Intel-Macs außerdem generisches x86-ASM verwenden?Oder gibt es einen geänderten Befehlssatz?Irgendwelche Informationen über Post Intel.

Auch:Ich weiß, dass ASM unter Windows in einer emulierten Umgebung ausgeführt werden kann, die vom Betriebssystem erstellt wurde, um dem Code den Eindruck zu vermitteln, dass er auf einem eigenen dedizierten Computer ausgeführt wird.Bietet OS X dasselbe?

War es hilfreich?

Lösung

Nach der Installation einer Xcode-Version für Intel-basierte Macs sollten Sie in der Lage sein, Assembler-Code zu schreiben.Xcode ist eine Suite von Tools, von denen nur eines die IDE ist, sodass Sie sie nicht verwenden müssen, wenn Sie dies nicht möchten.(Wenn Sie jedoch bestimmte Dinge klobig finden, melden Sie bitte einen Fehler unter Apples Bug-Reporter - Jeder Fehler geht an die Technik.) Darüber hinaus werden durch die Installation von Xcode sowohl der Netwide Assembler (NASM) als auch der GNU Assembler (GAS) installiert.Dadurch können Sie die Assembly-Syntax verwenden, mit der Sie am besten vertraut sind.

Werfen Sie auch einen Blick auf die Compiler- und Debugging-Anleitungen, denn diese dokumentieren die Aufrufkonventionen, die für die verschiedenen Architekturen verwendet werden, auf denen Mac OS X läuft, sowie die Funktionsweise des Binärformats und des Loaders.Insbesondere die IA-32 (x86-32)-Aufrufkonventionen können sich geringfügig von dem unterscheiden, was Sie gewohnt sind.

Beachten Sie außerdem, dass sich die Systemaufrufschnittstelle unter Mac OSSystemaufrufe gelten unter Mac OS X nicht als stabile API.Stattdessen verwenden Sie immer libSystem.Dadurch wird sichergestellt, dass Sie Code schreiben, der von einer Betriebssystemversion auf die nächste portierbar ist.

Bedenken Sie schließlich, dass Mac OSDurch das Codieren in Assembler optimieren Sie möglicherweise nicht so viel, wie Sie denken;Was auf einer Maschine optimal ist, kann auf einer anderen Maschine schlecht sein.Apple misst seine Compiler regelmäßig und stimmt ihre Ausgabe mit dem Optimierungsflag „-Os“ ab, um auf der gesamten Linie anständig zu sein, und es gibt umfangreiche Vektor-/Matrixverarbeitungsbibliotheken, die Sie verwenden können, um mit handabgestimmten CPU-spezifischen Implementierungen eine hohe Leistung zu erzielen .

Es ist großartig, zum Spaß zur Versammlung zu gehen.Heutzutage ist es nichts für schwache Nerven, zur Versammlung zu gehen, um schneller zu sein.

Andere Tipps

Wie bereits erwähnt, verwenden Sie kein Systemaufruf.Sie können zwar Standard-C-Bibliotheksaufrufe verwenden, beachten Sie jedoch, dass der Stapel gemäß Apple auf 16 Byte ausgerichtet sein MUSS IA32-Funktionsaufruf ABI.

Wenn Sie den Stapel nicht ausrichten, stürzt Ihr Programm ab __dyld_misaligned_stack_error wenn Sie eine der Bibliotheken oder Frameworks aufrufen.

Das folgende Snippet wird auf meinem System zusammengestellt und ausgeführt:

; 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

Eine schöne Schritt-für-Schritt-Anleitung für den x86-Mac finden Sie unter http://peter.michaux.ca/articles/assembly-hello-world-for-os-x.Die anderen Links, die ich ausprobiert habe, weisen einige Fallstricke auf, die nicht für Mac geeignet sind.

Kürzlich wollte ich lernen, wie man Intel x86 unter Mac OS X kompiliert:

Für Nasm:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho

Für alt:

-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

Für Shell:

./hello.o - execution

Einzeiler:

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

Lassen Sie mich wissen, ob das hilft!

Wie es geht, habe ich hier auf meinem Blog geschrieben:

http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html

Für eine ausführlichere Erklärung habe ich es hier auf meinem Github erklärt:

https://github.com/jaredsburrows/Assembly

Die Ausführung von Assembler-Code auf dem Mac ist nur 3 Schritte von Ihnen entfernt.Dies könnte mit XCODE erfolgen, besser ist jedoch die Verwendung des NASM-Befehlszeilentools.Zur Vereinfachung habe ich Xcode bereits installiert. Wenn Sie Xcode installiert haben, ist es gut.

Aber Sie können es auch ohne XCode tun.

Folge einfach:

  1. Installieren Sie zunächst NASM mit Homebrew brew install nasm
  2. Konvertieren Sie die .asm-Datei mit diesem Befehl in eine Obj-Datei nasm -f macho64 myFile.asm
  3. Führen Sie Obj File aus, um OutPut mit dem Befehl anzuzeigen ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64

Zur Vereinfachung ist unten eine einfache Textdatei mit dem Namen myFile.asm aufgeführt.

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

Kann ich auf Intel-Macs außerdem generisches x86-ASM verwenden?oder gibt es einen geänderten Befehlssatz?Alle Informationen zur Post-Intel-Mac-Montage helfen.

Es ist der gleiche Befehlssatz;Es sind die gleichen Chips.

Die verfügbaren Funktionen hängen von Ihrem Prozessor ab.Apple verwendet das gleiche Intel-Material wie alle anderen.Also ja, generisches x86 sollte in Ordnung sein (vorausgesetzt, Sie verwenden kein PPC :D).

Was die Tools angeht, denke ich, dass die beste Wahl ein guter Texteditor ist, der Assembler „versteht“.

Vergessen Sie die Suche nach einer IDE zum Schreiben/Ausführen/Kompilieren von Assembler auf dem Mac.Aber denken Sie daran, dass Mac UNIX ist.Sehen http://asm.sourceforge.net/articles/linasm.html.Eine gute (wenn auch kurze) Anleitung zum Ausführen von Assembler über GCC unter Linux.Sie können dies nachahmen.Macs verwenden Intel-Chips, daher sollten Sie sich die Intel-Syntax ansehen.

Vergessen Sie nicht, dass im Gegensatz zu Windows bei allen Unix-basierten Systemen im Gegensatz zu Windows die Quelle vor dem Ziel angegeben werden muss

Unter Windows ist es:

mov $source , %destination

aber auf dem Mac ist es umgekehrt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top