assembler x86 su un Mac
Domanda
Qualcuno sa di eventuali buoni strumenti (sto cercando Ide) per scrivere il montaggio su Mac.Xcode è un po ' ingombrante per me.
Inoltre, sul Mac Intel, posso usare il generico asm x86?O c'è una versione modificata del set di istruzioni?Eventuali informazioni sul post di Intel.
Inoltre:Io so che su windows, asm può essere eseguito in un ambiente emulato creato dal sistema operativo per lasciare che il codice di pensare è in esecuzione sul proprio computer dedicato.Non OS X fornire la stessa cosa?
Soluzione
Dopo l'installazione di qualsiasi versione di Xcode targeting computer Mac basati su Intel, si dovrebbe essere in grado di scrivere codice assembly.Xcode è una suite di strumenti, di cui solo uno è l'IDE, quindi non devi usare se non si desidera.(Detto questo, se ci sono cose specifiche che si trova goffo, si prega di inviare un bug Apple bug reporter - ogni bug va in ingegneria.) Inoltre, l'installazione di Xcode viene installato sia il Netwide Assembler (NASM) e GNU Assembler (GAS);che vi permetterà di utilizzare qualsiasi assemblea sintassi siete più confortevole con.
Ti consigliamo anche di dare un'occhiata al Compilatore & Debug Guide, perché quei documenti le convenzioni di chiamata per le varie architetture che Mac OS X è in esecuzione, così come il formato binario e il caricatore di lavoro.IA-32 (x86-32) convenzioni di chiamata, in particolare, può essere leggermente diverso da quello a cui siete abituati.
Un'altra cosa da tenere a mente è che la chiamata di sistema interfaccia di Mac OS X è diverso da quello che si potrebbe essere utilizzato per DOS/Windows, Linux o altri BSD sapori.Chiamate di sistema non è più considerato una stabile API su Mac OS X;invece di andare sempre attraverso libSystem.Garantire che si sta scrivendo codice che è portatile da una versione del sistema operativo per il prossimo.
Infine, tenere a mente che Mac OS X viene eseguito su un abbastanza vasta gamma di hardware di tutto, dalla a 32-bit Core Singolo attraverso la high-end quad-core Xeon.Codifica in assemblea potrebbe non essere l'ottimizzazione di quanto si pensi;cosa ottimale su una macchina può essere pessimal su un altro.Apple regolarmente le misure dei suoi autori e brani della loro produzione e, con il "sistema operativo" flag di ottimizzazione per essere decente in tutta la sua linea, e ci sono ampi vettore/matrice librerie di elaborazione che è possibile utilizzare per ottenere prestazioni più elevate con la mano sintonizzati CPU-implementazioni specifiche.
Andando assemblea per il divertimento è grande.Andando assemblea per la velocità non è per i deboli di cuore in questi giorni.
Altri suggerimenti
Come detto prima, non usare la syscall.È possibile utilizzare la libreria C standard chiamate, però, ma essere consapevoli del fatto che lo stack DEVE essere di 16 byte allineati per Apple IA32 chiamata di funzione ABI.
Se non allineare la pila, il programma andrà in crash in __dyld_misaligned_stack_error
quando si effettua una chiamata in una qualsiasi delle biblioteche o di quadri.
Il seguente frammento di monta e funziona sul mio sistema:
; 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
Per un bel passo-passo x86 specifici di Mac introduzione vedere http://peter.michaux.ca/articles/assembly-hello-world-for-os-x.Gli altri link che ho provato sono alcuni non-Mac insidie.
Recentemente ho voluto imparare a compilare Intel x86 su Mac OS X:
Per nasm:
-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho
Per 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
Per La 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
Fatemi sapere se questo aiuta!
Ho scritto come farlo sul mio blog qui:
http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html
Per una più dettagliata spiegazione, ho spiegato sul mio Github qui:
L'esecuzione di Codice in assembly su Mac è a soli 3 passi da te.Esso può essere fatto utilizzando XCODE ma è meglio usare il NASM Strumento a Riga di Comando.Per Mio Agio, ho già installato Xcode, se si dispone di Xcode installato il suo bene.
Ma Si può fare senza XCode così.
Basta Seguire:
- Prima di Installare NASM utilizzo di Homebrew
brew install nasm
- la conversione .asm file nel File Obj che utilizza questo comando
nasm -f macho64 myFile.asm
- Eseguire il File Obj di vedere l'OutPut utilizzando il comando
ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64
Semplice File di Testo denominato miofile.asm è scritto di seguito per la vostra convenienza.
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
Inoltre, sul Mac Intel, posso usare il generico asm x86?o c'è una versione modificata del set di istruzioni?Eventuali informazioni sul post di Intel Mac assembly aiuta.
E ' lo stesso set di istruzioni;e ' lo stesso chip.
Le caratteristiche disponibili da utilizzare dipendono dal vostro processore.Apple utilizza la stessa Intel roba, come tutti gli altri.Quindi sì, generico x86 dovrebbe andare bene (supponendo che non siete su un PPC :D).
Per quanto strumenti andare, penso che la cosa migliore è un buon editor di testo che 'capisce' assemblea.
Dimenticare di trovare un IDE per scrivere/eseguire/assembler compilare su Mac.Ma, ricordate mac è UNIX.Vedere http://asm.sourceforge.net/articles/linasm.html.Una guida decente (anche se breve) per l'esecuzione di assembler via GCC su Linux.È possibile simulare questo.Macs usa i chip di Intel in modo che si desidera guardare Intel sintassi.
Non dimenticate che a differenza di Windows, tutti basati su Unix, sistema hanno bisogno di una fonte di prima destinazione a differenza di Windows
Su Windows la sua:
mov $source , %destinazione
ma il Mac è l'altro senso intorno.