2012-12-31 6 views
6

Sto provando a compilare e collegare il mio primo programma su Assembler. provo a compilare il seguente codice:Come compilare usando nasm su MacOSX

; %include "stud_io.inc"  
global _main  

section .text 
_main: 
    xor eax, eax 
again: 
    ; PRINT "Hello" 
    ; PUTCHAR 10 
    inc eax  
    cmp eax, 5 
    jl again 

Sotto il comando di console per la compilazione e il collegamento di un programma:

-bash-3.2$ nasm -f macho main.asm -o main.o && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o 

Ma il risultato è:

ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
    -u command line option 
ld: symbol(s) not found for architecture x86_64 

penso proprio necessario compilare il file main.asm per x86_64 .. Come compilare correttamente i programmi per il mio sistema?

+0

'-f macho64' forse? – JasonD

+0

nasm non riconosce questa opzione –

+0

quale versione di nasm stai usando? – JasonD

risposta

9

Si consiglia di aggiornare prima il NASM.

Dopo di che, provare a eseguire questo:

nasm -f macho64 main.asm -o main.o && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o -lSystem 

Si noti che il nuovo comando aggiunge il suggerimento di JasonD sopra (macho64), ma aggiunge anche il -lSystem al comando ld per fermare ld dal gettare seguente errore:

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64 
+0

sì, aggiungo -lSystem. Ma ora ho "Errore di segmentazione: 11" –

+0

Il segfault è un problema con l'esecuzione del codice. Dopo l'istruzione 'jl', aggiungi un'istruzione' ret' (dato che stai usando un main). Nota che se stai usando un assembly x86 puro, devi uscire usando la chiamata di sistema exit in 'int 0x80' (ma non in questo caso). Ricorda che il contatore del PC ha bisogno di sapere dove andare per continuare l'esecuzione quando il tuo codice è finito. – RageD

1

Ho notato che la maggior parte degli esempi mostra programmi di assemblaggio standalone, ma forse è più comune che l'assembly venga chiamato da C. Ho creato un semplice programma C che utilizza una funzione minima assemblata al nas ike questo:

extern unsigned cpuid(unsigned n); 

/* ... */ 
     unsigned n = cpuid(1); 

Il gruppo si presenta così:

section .text 
    global _cpuid 

_cpuid: 
    push rbp 
    mov rbp, rsp 
    mov rax, rdi 
    cpuid 
    mov rax, rcx 
    leave 
    ret 

Potete vedere il tutto, comprese le opzioni nasm CLI nel makefile, qui:

https://github.com/ecashin/low/tree/master/cpuid

E ' fa qualcosa di leggermente utile stampando la disponibilità di alcune caratteristiche specifiche della CPU. (Ma lo fa usando CPUID senza verificare se è disponibile. Se la CPU è Intel e più recente di un i486, va bene.)

L'esempio è testato su Mac OS X Snow Leopard con il nasino dal collezione di porti. La rimozione del prefisso di sottolineatura è l'unica modifica necessaria per il porting su Linux x86_64.

+0

Inoltre, ho dovuto aggiornare NASM come gli altri commenti dicono prima che potrei usare '-fmacho64'. –