2012-12-31 7 views
6

Próbuję skompilować i połączyć mój pierwszy program na asembler. próbuję skompilować następujący kod:Jak skompilować przy użyciu nasm na 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 

Następujące polecenie konsoli do kompilowania i łączenie program:

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

ale wynik jest:

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 

Myślę, że konieczne skompilować plik main.asm dla x86_64 .. Jak poprawnie skompilować programy dla mojego systemu?

+0

"-f macho64" może? – JasonD

+0

nasm nie rozpoznaje tej opcji –

+0

jakiej wersji nasm używasz? – JasonD

Odpowiedz

9

Polecam najpierw aktualizację swojego NASM.

Po tym, spróbuj uruchomić to:

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

Zauważ, że nowa komenda dodaje powyżej (macho64) sugestię JasonD, ale dodaje również -lSystem dowodzić ld zatrzymać ld od rzucania następujący błąd:

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

tak, dodaję -lSystem. Ale teraz mam "Uszkodzenie segmentacji: 11" –

+0

Uszkodzenie jest problemem z wykonywaniem kodu. Po instrukcji 'jl' dodaj instrukcję' ret' (ponieważ używasz głównej). Zauważ, że jeśli używasz czystego zestawu x86, musisz wyjść używając wywołania systemowego wyjścia w 'int 0x80' (ale nie w tym przypadku). Pamiętaj, że licznik komputerów musi wiedzieć, gdzie iść, aby kontynuować wykonywanie po zakończeniu kodu. – RageD

1

Zauważyłem, że większość przykładów pokazuje samodzielne programy montażowe, ale jest to prawdopodobnie bardziej powszechne, gdy wywoływane jest zebranie z C. Stworzyłem prosty program w języku C, który używa minimalnej funkcji złożonej z nasm IKE to:

extern unsigned cpuid(unsigned n); 

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

Zespół wygląda następująco:

section .text 
    global _cpuid 

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

Można zobaczyć całość, w tym opcje nasm CLI w makefile, tutaj:

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

It robi coś nieznacznie użytecznego, drukując dostępność niektórych funkcji specyficznych dla procesora. (Ale robi to za pomocą CPUID bez sprawdzania, czy jest dostępny.Jeśli procesor jest Intel i nowszy niż i486, to jest w porządku.)

Przykład został przetestowany w systemie Mac OS X Snow Leopard z nasm z kolekcja portów. Usunięcie przedrostka podkreślenia jest jedyną zmianą niezbędną do przeniesienia do systemu Linux x86_64.

+0

Musiałem również zaktualizować NASM, tak jak inne komentarze tutaj mówiące przed użyciem '-fmacho64'. –