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?

È stato utile?

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:

https://github.com/jaredsburrows/Assembly

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:

  1. Prima di Installare NASM utilizzo di Homebrew brew install nasm
  2. la conversione .asm file nel File Obj che utilizza questo comando nasm -f macho64 myFile.asm
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top