2010-11-26 7 views
14

पर x86 असेंबलर का उपयोग कर हैलो वर्ल्ड मैं अपने मैक पर कुछ x86 असेंबली प्रोग्रामिंग में गोता लगाने की कोशिश कर रहा हूं, लेकिन मुझे निष्पादन योग्य बनाने में परेशानी हो रही है। समस्या लिंकिंग चरण में प्रतीत होती है।मैक 0 एसएक्स

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 

कार्यक्रम इकट्ठा:

as -o helloWorld.o helloWorld.s 

लिंक वस्तु फ़ाइल:

ld -o helloWorld helloWorld.o 

त्रुटि मैं इस बिंदु पर मिलता है:

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

जो भी मैं गलत/लापता कर रहा हूं उस पर कोई सलाह बहुत उपयोगी होगी। धन्यवाद

+3

के लिए एक काम समाधान मैं जानता हूँ कि मैं थोड़ा देर हो रही है, लेकिन आप '' _start' start' को बदलने की जरूरत है। – sidyll

उत्तर

18

असेंबलर और लिंकर को माइक्रो-मैनेज करने की कोशिश करने के बजाय आपको शायद जीसीसी के साथ निर्माण करना आसान लगेगा, उदाहरण के लिए

$ gcc helloWorld.s -o helloWorld 

संयोग से, यह एक काम कर रहे सी कार्यक्रम के साथ शुरू करते हैं, और इस से उत्पन्न एएसएम अध्ययन करने के लिए शिक्षाप्रद हो सकता है (आप शायद _main को _start बदलने के लिए है, तो आप इस मार्ग जाना चाहता हूँ।) । जैसे

#include <stdio.h> 

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

    return 0; 
} 

जब gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.S साथ संकलित उत्पन्न करता है:

.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 

आप अपनी खुद की "हैलो दुनिया" के लिए एक टेम्पलेट या अन्य प्रयोगात्मक एएसएम कार्यक्रमों के रूप में यह प्रयोग करने पर विचार करने के लिए, विशेष रूप से यह देखते हुए कि यह पहले से ही बनाता है चाहते हो सकता है और रन:

$ gcc -m32 hello.S -o hello 
$ ./hello 
Hello world! 

एक अंतिम टिप्पणी: लिनक्स उन्मुख एएसएम किताबें या ट्यूटोरियल से उदाहरण ले रही है और ओएस एक्स के तहत उन्हें लागू करने की कोशिश कर रहा से सावधान - वहाँ की गिरफ्तारी ई महत्वपूर्ण मतभेद!

+1

यह एक आकर्षण की तरह काम करता है! : डी –

+0

कोई विचार क्यों मुझे 'gcc-m32 हैलो.-हैलो' करते समय यह त्रुटि क्यों मिलेगी? एलडी: चेतावनी: पीआईई अक्षम।पीआईई पर हस्ताक्षर किए गए कोड में पूर्ण पते (शायद-गतिशील-नो-तस्वीर) की अनुमति नहीं है, लेकिन _vain में /var/folders/9b/n3lsk87513d57pzh0qvxjmz00000gn/T/hello-r4fQK2.o से उपयोग किया जाता है। इस चेतावनी को ठीक करने के लिए, -ddynamic-no-pic या -Wl, -no_pie – michaelsnowden

+0

के साथ लिंक न करें, क्या आप असामान्य प्लेटफ़ॉर्म का उपयोग कर रहे हैं? –

3

प्रयास करें:

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

तो:

./HelloWorld 

जानकारी:

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

hello.asm

.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 

फिर आर संयुक्त राष्ट्र:

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

यह मैक ओएस एक्स मच -0 जीएनयू आधारित अस्सेम्ब्लेर्स

+0

यह मेरे लिए काम करता था लेकिन .asm फ़ाइल में टिप्पणी कोड को हटाना पड़ा। लिंकर कमांड को '-macosx_version_min 10.6' में भी गुज़रने से चेतावनी से बचा जाता है, हालांकि यह किसी भी तरह संकलित करता है। – lacostenycoder