2012-11-01 9 views
9

मेरे पास 32 बिट असेंबली भाषा में प्रोग्राम लिखा गया है ... अब मैं इसे 64 बिट ओएस पर संकलित नहीं कर सकता। हमारे स्कूल में वे विशिष्ट हैं और कार्यक्रम 32 बिट संस्करण में लिखा जाना है। यहां मेरा कार्यक्रम है:64 बिट ubuntu पर 32 बिट असेंबलर संकलित

bits 32 
extern _printf 
global _start 

section .data 
    message db "Hello world!!", 10, 0 

section .text 

_start: 
    pushad 
    push dword message 
    call _printf 
    add esp, 4 
    popad 
    ret 

कोई विचार? मैंने इसे संकलित करने के कई तरीकों की कोशिश की है। त्रुटि उत्पादन संकलन के बाद:

nasm -f elf64 vaja4.asm 
ld vaja4.o -o vaja4 
./vaja4 

उत्पादन:

vaja4.o: In function `_start': 
vaja4.asm:(.text+0x7): undefined reference to `_printf' 
+0

क्या printf नहीं होना चाहिए _printf? – iabdalkader

+0

वही त्रुटि: vaja4.o: फ़ंक्शन 'स्टार्ट' में: vaja4.asm :(। टेक्स्ट + 0x7): 'printf ' – Klemenko

उत्तर

15

printf को सबसे पहले परिवर्तन _printf और main को _start प्रतीक है, तो gcc का उपयोग वस्तु फ़ाइल से जोड़ने के लिए है, जो होगा:

वैसे भी, plz आदेशों की निम्न क्रम को इकट्ठा करने और अपने कार्यक्रम लिंक करने का प्रयास स्वचालित रूप से इसे libc, से लिंक करें, आपको ऐसा करने की आवश्यकता है क्योंकि AFAIK आप main के बिना libc से लिंक नहीं कर सकते हैं। इसके अलावा, आप का उपयोग करना चाहिए elf32 elf64 जब कोडांतरण क्योंकि कोड 32 बिट निर्देश है नहीं:

bits 32 
extern printf 
global main 

section .data 
    message db "Hello world!!", 10, 0 

section .text 

main: 
    pushad 
    push dword message 
    call printf 
    add esp, 4 
    popad 
    ret 

और साथ निर्माण:

nasm -f elf32 vaja4.asm 
gcc -m32 vaja4.o -o vaja4 
$./test 
$Hello world!! 

वहाँ एक अच्छा यहाँ ट्यूटोरियल है:

http://jdefr.swippet.com/2012/03/22/using-libc-with-assembly/

संपादित करें:

के बाद से अब आप एक 64-बिट सिस्टम पर 32-बिट कोड संकलित कर रहे हैं, तो आप पुस्तकालयों

apt-get install ia32-libs 
+1

हां, यह सही तरीका है। यदि आप libc का उपयोग करना चाहते हैं तो आपको जीसीसी का उपयोग करके प्रवेश बिंदु और लिंक के रूप में 'मुख्य' का उपयोग करना चाहिए ताकि libc के उचित टुकड़े खींचे जा सकें और प्रारंभिक/शट डाउन की देखभाल की जा सके। साथ ही, यदि आप libc के बिना बाइनरी बनाते हैं, तो बस केवल 'मुख्य' से काम करता है, आपको एक्जिट सिस्टम कॉल का उपयोग करना होगा। – Jester

+0

ठीक है मैंने आपके रास्ते की कोशिश की। Gcc-m32 vaja4.o -o vaja4 के बाद यह मुझे त्रुटि आउटपुट देता है: http://pastebin.com/jX3N2GSJ – Klemenko

+0

आपको 32-बिट्स पुस्तकालयों को स्थापित करने की आवश्यकता है-स्थापित करें Iia32-libs – iabdalkader

1

यह मेरे लिए लगता है कि आप सी पुस्तकालय के खिलाफ से जोड़ने के लिए है, जो भाग printf समारोह (और अन्य) प्रदान करता है भूल गया:

ld vaja4.o -o vaja4 -lc 
4

मुझे संदेह है कि आप जो त्रुटि देखते हैं वह 32/64 बिट समस्या है। त्रुटि है कि आप देख यानी

vaja4.asm:(.text+0x7): undefined reference to `_printf' 

स्पष्ट रूप से आप प्रतीक _printf कह रहा है जिसका मतलब है कि printf समारोह के लिए पुस्तकालय जुड़ा हुआ नहीं किया जा रहा है अनिर्धारित रहता है।

अपने को जोड़ने कदम यानी

ld vaja4.o -o vaja4 

किसी भी लाइब्रेरी शामिल नहीं है। आपको अपने प्रोग्राम को लाइब्रेरी से लिंक करने की आवश्यकता है जो printf फ़ंक्शन की परिभाषा प्रदान कर सकता है। मेरा मानना ​​है कि एलडी को इन संदेशों के साथ आपको परेशान किए बिना लाइब्रेरी को स्वयं चुनना चाहिए, लेकिन क्योंकि यह इस फ़ंक्शन के लिए उपयुक्त सी लाइब्रेरी नहीं ढूंढ पा रहा है, मुझे लगता है कि आपके पास आवश्यक पुस्तकालय नहीं हैं यानी 32 बिट या 64 लाइब्रेरी गायब है।

nasm -f elf vaja4.asm 
ld -m elf_i386 vaja4.o vaja4 
./vaja4 
+0

के लिए अनिर्धारित संदर्भ या यहां तक ​​कि' ld -m elf_i386 -I/lib/ld-linux.so .2 -lc vaja4.o -o vaja4' को '-I' स्विच की आवश्यकता नहीं हो सकती - निश्चित रूप से आउटपुट फ़ाइल नाम पर '-lc' और' -o' की आवश्यकता होती है। '_start' लेबल को कूद दिया जाता है, जिसे कॉल नहीं किया जाता है। इसलिए आप इससे 'ret' नहीं कर सकते हैं। मंच को जोड़ने के लिए 'मुख्य' और gcc ... –

+0

या' ld -m elf_i386 -s -o vaja4 vaja4.o' का उपयोग करना आसान है। –

7

के 32-बिट संस्करण स्थापित करने के लिए Ubuntu के 12 की आवश्यकता होगी।10, आप

gcc -m32 vaja4.o -o vaja4 

काम करने के लिए विकास संकुल पहले

sudo apt-get update 
sudo apt-get install libc6-dev-i386 

स्थापित करने की आवश्यकता।

+0

एक आकर्षण की तरह काम किया। –

संबंधित मुद्दे