65 votes

Assemblage x86 sur un Mac

Est-ce que quelqu'un connaît de bons outils (je cherche des IDE) pour écrire de l'assemblage sur le Mac. Xcode est un peu encombrant pour moi.

De plus, sur les Macs Intel, puis-je utiliser l'asm générique x86 ? Ou y a-t-il un jeu d'instructions modifié ? Toute information sur le post Intel.

Aussi : Je sais que sous Windows, asm peut s'exécuter dans un environnement émulé créé par le système d'exploitation pour laisser le code penser qu'il s'exécute sur sa propre machine dédiée. Est-ce que OS X offre la même chose ?

82voto

Chris Hanson Points 34485

Après avoir installé n'importe quelle version de Xcode ciblant les Macs basés sur Intel, vous devriez être capable d'écrire du code assembleur. Xcode est une suite d'outils, dont un seul est l'IDE, donc vous n'êtes pas obligé de l'utiliser si vous ne le souhaitez pas. (Ceci dit, s'il y a des choses spécifiques que vous trouvez maladroites, veuillez déposer un bogue à l'adresse suivante Le rapporteur de bogues d'Apple - chaque bug va à l'ingénierie). De plus, l'installation de Xcode installera à la fois l'assembleur Netwide (NASM) et l'assembleur GNU (GAS) ; cela vous permettra d'utiliser la syntaxe d'assemblage avec laquelle vous êtes le plus à l'aise.

Vous voudrez également jeter un coup d'œil à l'onglet Guides de compilation et de débogage car ils documentent les conventions d'appel utilisées pour les différentes architectures sur lesquelles Mac OS X fonctionne, ainsi que le fonctionnement du format binaire et du chargeur. Les conventions d'appel IA-32 (x86-32), en particulier, peuvent être légèrement différentes de celles auxquelles vous êtes habitué.

Une autre chose à garder à l'esprit est que l'interface d'appel système sous Mac OS X est différente de celle à laquelle vous êtes habitué sous DOS/Windows, Linux ou les autres saveurs BSD. Les appels système ne sont pas considérés comme une API stable sous Mac OS X ; vous devez toujours passer par libSystem. Cela vous permettra d'écrire du code qui sera portable d'une version à l'autre du système d'exploitation.

Enfin, gardez à l'esprit que Mac OS X fonctionne sur une gamme assez large de matériel - du Core Single 32 bits au Xeon quatre cœurs haut de gamme. En codant en assembleur, vous n'optimisez peut-être pas autant que vous le pensez ; ce qui est optimal sur une machine peut être pessimiste sur une autre. Apple mesure régulièrement ses compilateurs et règle leur sortie avec le drapeau d'optimisation "-Os" pour qu'elle soit décente sur toute sa gamme, et il existe des bibliothèques de traitement vectoriel/matriciel étendues que vous pouvez utiliser pour obtenir des performances élevées avec des implémentations spécifiques au processeur réglées à la main.

Aller à l'assemblée pour le plaisir, c'est bien. Aller à l'assemblée pour la vitesse n'est pas pour les âmes sensibles de nos jours.

0 votes

Deux personnes ont upvoted son sass et aucune personne n'a corrigé le lien... ce serait bien si Apple faisait rediriger les anciens liens vers les nouveaux articles... J'ai constaté que les liens vers les docs Apple depuis SO sont presque toujours morts...

3 votes

Version Archive.org (dernière version avant qu'elle ne soit coupée) web.archive.org/web/20090622125037/http://developer.apple.com/

29voto

David DeHaven Points 191

Comme indiqué précédemment, n'utilisez pas syscall. Vous pouvez cependant utiliser les appels de la bibliothèque C standard, mais soyez conscient que la pile DOIT être alignée sur 16 octets, conformément à la directive de l'Apple Appel de fonction IA32 ABI .

Si vous n'alignez pas la pile, votre programme se plantera en __dyld_misaligned_stack_error lorsque vous effectuez un appel dans l'une des bibliothèques ou l'un des frameworks.

Le snippet suivant s'assemble et s'exécute sur mon système :

; 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

0 votes

Quelqu'un peut-il me dire pourquoi exécuter cet exemple avec "nasm -f macho hello.asm && gcc -arch i386 -e _main -lSystem -o hello hello.o && ./hello" donne "Bus error : 10" à la fin de la sortie ?

0 votes

J'ai compris : Je pense qu'il y avait un bug. La fin de clib_prolog devrait sous %1 octets afin d'ajouter des arguments, et clib_epilog devrait ajouter %1 octets. J'ai modifié la réponse pour refléter cela.

10voto

Jared Burrows Points 3932

Récemment, j'ai voulu apprendre comment compiler Intel x86 sur Mac OS X :

Pour nasm :

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

Pour 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

Pour Shell :

./hello.o - execution

Un seul mot :

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

Faites-moi savoir si cela vous aide !

J'ai écrit comment le faire sur mon blog ici :

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

Pour une explication plus verbeuse, j'ai expliqué sur mon Github ici :

https://github.com/jaredsburrows/Assembly

8voto

Flash Sheridan Points 1013

Pour une bonne introduction étape par étape spécifique au Mac x86, voir http://peter.michaux.ca/articles/assembly-hello-world-for-os-x . Les autres liens que j'ai essayés présentent des pièges pour les non-Mac.

6voto

Josh Points 4344

De plus, sur les Macs Intel, puis-je utiliser l'asm générique x86 ? ou y a-t-il un jeu d'instructions modifié ? Toute information sur l'assemblage post-Mac Intel est utile.

C'est le même jeu d'instructions ; ce sont les mêmes puces.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X