2010-11-26 31 views
14

Mac'imde bazı x86 montaj programlarına dalmaya çalışıyorum, ancak bir yürütülebilir dosya üretmekte sorun yaşıyorum. Sorun bağlantı aşamasında görünüyor.Merhaba Dünya, Mac 0SX üzerinde x86 assembler kullanıyor

helloWorld.s:

.data 

    HelloWorldString: 
    .ascii "Hello World\n" 

.text 

.globl _start 

_start: 
    # load all the arguments for write() 
    movl $4, %eax 
    movl $1, %ebx 
    movl $HelloWorldString, %ecx 
    movl $12, %edx 
    # raises software interrupt to call write() 
    int $0x80 

    # call exit() 
    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

programı birleştirin:

as -o helloWorld.o helloWorld.s 

Linki nesne dosyası:

ld -o helloWorld helloWorld.o 

Bu noktada olsun hatadır:

ld: could not find entry point "start" (perhaps missing crt1.o) for inferred architecture x86_64 

Yanlış/eksik yaptığım şeyler hakkında herhangi bir tavsiye çok yararlı olacaktır. teşekkürler

+3

için çalışan bir çözümdür, ama start' 'için' _start' değiştirmeniz gerekir. – sidyll

cevap

18

Muhtemelen assembc ve linker'i mikro-yönetmeye çalışmak yerine gcc ile inşa etmeyi daha kolay bulacaksınız.

$ gcc helloWorld.s -o helloWorld 

(Muhtemelen bu yol giderseniz _main için _start değiştirmek istersiniz.)

Bu arada, bir çalışma C programı ile başlayın ve bu üretilen asm incelemek için öğretici olabilir . Örneğin.

#include <stdio.h> 

int main(void) 
{ 
    puts("Hello world!\n"); 

    return 0; 
} 

gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.S ile derlenmiş oluşturur:

.cstring 
LC0: 
    .ascii "Hello world!\12\0" 
    .text 
    .align 4,0x90 
.globl _main 
_main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $24, %esp 
    movl $LC0, (%esp) 
    call _puts 
    xorl %eax, %eax 
    leave 
    ret 
    .subsections_via_symbols 

Hele sen zaten inşa göz önüne alındığında, bir kendi "Merhaba dünya" için şablon veya diğer deneysel asm programları gibi bu kullanmayı düşünün isteyebilirsiniz ve çalışır:

son yorum

$ gcc -m32 hello.S -o hello 
$ ./hello 
Hello world! 
: Linux yönelimli asm kitap veya öğreticiler örnekler alarak ve OS X altında bunları uygulamak için çalışmakla dikkat - orada ar önemli farklılıklar!

+1

Bir çekicilik gibi çalışır! : D –

+0

Bu hatayı neden goc -m32 merhaba. -o merhaba? ld: uyarı: PIE devre dışı.Mutlak adresleme (belki de -mdynamic-no-pic) kodunda PIE'ye izin verilmez, ancak /var/folders/9b/n3lsk87513d57pzh0qvxjmz00000gn/T/hello-r4fQK2.o adresinden kullanılır. Bu uyarıyı düzeltmek için, -mdynamic-no-pic ile derlemeyin ya da -Wl ile bağlantı kurmayın, -no_pie – michaelsnowden

+0

Alışılmadık bir platform mu kullanıyorsunuz? –

3

Dene: o zaman

ld -e _start -arch x86_64 -o HelloWorld HelloWorld.S 

:

./HelloWorld 

Bilgi:

-e <entry point> 
-arch <architecture>, You can check your architecture by uname -a 
-o <output file> 
2

hello.asm Sonra

.data 

    HelloWorldString: 
    .ascii "Hello World!\n" 

.text 

.globl start 

start: 
    ; load all the arguments for write() 
    movl $0x2000004, %eax 
    movl $1, %ebx 
    movq [email protected](%rip), %rsi 
    movq $100, %rdx 
    ; raises software interrupt to call write() 
    syscall 

    ; call exit() 
    movl $0x2000001, %eax 
    movl $0, %ebx 
    syscall 

r un:

$ as -arch x86_64 -o hello.o hello.asm 
$ ld -o hello hello.o 
$ ./hello 

Bu ben biraz geciktim biliyorum, Mac OS X Mach-0 GNU tabanlı montajcılar

+0

Bu benim için çalıştı, ancak yorumlanmış kodu .asm dosyasında kaldırmak zorunda kaldı. Ayrıca '-macosx_version_min 10.6' linker komutuna geçmek, yine de derlemesine rağmen uyarıdan kaçınıyor. – lacostenycoder

İlgili konular