Question

Est-ce que quelqu'un connaît de bons outils (je recherche des IDE) pour écrire des assemblys sur Mac.Xcode est un peu lourd pour moi.

De plus, sur les Mac Intel, puis-je utiliser un asm x86 générique ?Ou existe-t-il un jeu d'instructions modifié ?Toute information sur la publication 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 croire au code qu'il s'exécute sur sa propre machine dédiée.OS X offre-t-il la même chose ?

Était-ce utile?

La solution

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

Vous voudrez également jeter un œil à Guides du compilateur et du débogage, car ceux-ci 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 sur Mac OS X est différente de celle à laquelle vous pourriez être habitué sous DOS/Windows, Linux ou les autres versions de BSD.Les appels système ne sont pas considérés comme une API stable sur Mac OS X ;au lieu de cela, vous passez toujours par libSystem.Cela garantira que vous écrivez du code portable d’une version du système d’exploitation à la suivante.

Enfin, gardez à l'esprit que Mac OS X fonctionne sur une gamme assez large de matériel - du Core Single 32 bits au Xeon quadricœur 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 pessimal sur une autre.Apple mesure régulièrement ses compilateurs et ajuste leur sortie avec l'indicateur d'optimisation "-Os" pour qu'ils soient corrects sur toute sa gamme, et il existe de nombreuses bibliothèques de traitement vectoriel/matriciel 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 s’amuser, c’est génial.De nos jours, aller à l’assemblée pour aller vite n’est pas pour les âmes sensibles.

Autres conseils

Comme indiqué précédemment, n'utilisez pas d'appel système.Vous pouvez cependant utiliser les appels de bibliothèque C standard, mais sachez que la pile DOIT être alignée sur 16 octets selon Apple. Appel de fonction IA32 ABI.

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

L'extrait 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

Pour une 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 non-Mac.

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

Pour le 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

Bon 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 aide !

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

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

Pour une explication plus détaillée, j'ai expliqué sur mon Github ici :

https://github.com/jaredsburrows/Assembly

L’exécution du code assembleur sur Mac n’est qu’à 3 étapes de vous.Cela pourrait être fait en utilisant XCODE, mais il est préférable d'utiliser l'outil de ligne de commande NASM.Pour ma facilité, j'ai déjà installé Xcode, si Xcode est installé, c'est bien.

Mais vous pouvez également le faire sans XCode.

Il suffit de suivre:

  1. Installez d’abord NASM à l’aide de Homebrew brew install nasm
  2. convertir le fichier .asm en fichier Obj à l'aide de cette commande nasm -f macho64 myFile.asm
  3. Exécutez le fichier Obj pour voir OutPut à l'aide de la commande ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64

Un fichier texte simple nommé myFile.asm est écrit ci-dessous pour votre commodité.

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

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

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

Les fonctionnalités disponibles dépendent de votre processeur.Apple utilise les mêmes éléments Intel que tout le monde.Alors oui, le x86 générique devrait convenir (en supposant que vous n'êtes pas sur un PPC :D).

En ce qui concerne les outils, je pense que votre meilleur pari est un bon éditeur de texte qui « comprend » l'assemblage.

Oubliez la recherche d'un IDE pour écrire/exécuter/compiler l'assembleur sur Mac.Mais rappelez-vous que Mac est UNIX.Voir http://asm.sourceforge.net/articles/linasm.html.Un guide décent (bien que court) pour exécuter l'assembleur via GCC sous Linux.Vous pouvez imiter cela.Les Mac utilisent des puces Intel, vous souhaitez donc examiner la syntaxe Intel.

N'oubliez pas que contrairement à Windows, tous les systèmes basés sur Unix doivent avoir la source avant la destination contrairement à Windows

Sous Windows, c'est :

déplacement $source , %destination

mais sur Mac, c'est l'inverse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top