2009-11-30 17 views
5

मैं निम्नलिखित विधानसभा कोडविधानसभा विभाजन दोष

#cpuid using C library Functions 
.section .data 
output: 
.asciz "The Processor Vendor ID is '%s'\n" 
.section .bss 
.lcomm buffer, 12 
.section .text 
.globl main 
main: 
movq $0, %rax 
cpuid 
movq $buffer, %rdi 
movq %rbx, (%rdi) 
movq %rdx, (%rdi) 
movq %rcx, (%rdi) 
pushq $buffer 
pushq $output 
call printf 
addq $8, %rsp 
pushq $0 
call exit 

की चल के दौरान एक त्रुटि हुई यह सी पुस्तकालय कॉलिंग का हिस्सा पर विभाजन गलती का सामना करना पड़ा: कॉल printf यह x86_64 मोड में चल रहा है। सी पुस्तकालय के संबंध में x64 कोड के संकलन के दौरान मुझे कुछ भी याद आया? दोनों अपने तार समाप्त अशक्त कर रहे हैं: या वहाँ कुछ कोड के साथ गलत

धन्यवाद

+2

के बीच उन movq के – Managu

+1

धन्यवाद उचित मात्रा द्वारा% RDI को बढ़ाने के लिए चाहते हो सकता है हर कोई, मैंने इस मुद्दे को हल किया। यह गलत lib था जिसे मैंने मैन्युअल रूप से/lib/ld-linux-x86-64.so.2 के साथ मैन्युअल रूप से लोड करने के बाद ठीक काम किया और मैंने मुख्य समारोह को _start के साथ बदल दिया। मैं इसे गतिशील लिंकिंग के रूप में ld। खराब अंग्रेजी –

उत्तर

0
नहीं

विधानसभा से परिचित है, तो अंधेरे में एक शॉट है?

+0

'.asciz' के लिए खेद है स्वचालित रूप से समाप्ति शून्य जोड़ता है। – querist

4

क्या सी रनटाइम लाइब्रेरी का प्रारंभिक नाम कहा जा रहा है? Stdout को स्थापित करने के लिए इसे पहले चलाने के लिए है। बीटीडब्लू, एक स्टैक ट्रेस समस्या के कारण के रूप में संदेह को खत्म कर देगा।

इसके अलावा,% s12% के साथ बफर को बहने से% s रूपांतरण को रोकें, या केवल बफर के बाद एक NUL बाइट डालें।

0

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

ईमानदारी से, आप इस कार्यक्रम को लिखने से वास्तव में बहुत बेहतर हैं, जो सी में लाइब्रेरी फ़ंक्शन को कॉल करता है, सीपीयूआईडी कोड को __cdecl फ़ंक्शन के अंदर इनलाइन असेंबली के रूप में लिखें, क्या यह इसके परिणाम को स्ट्रिंग पॉइंटर पर लिखता है, और उसके बाद एक सी प्रोग्राम से उस समारोह को कॉल करें।

void GetCPUID(char *toStr) 
{ 
// inline assembly left as exercise for the reader.. 
// write ebx to *toStr, ecx to *toStr+4, edx to *toStr+8, and 0 to *toStr+12 
} 

void PrintCPUID() 
{ 
    char cpuidstr[16]; 
    GetCPUID(cpuidstr); 
    printf("cpuid: %s\n", cpuidstr); 

} 
2

64 बिट fprintf के लिए कोडांतरक कॉल प्रतीत होता है बदल रहे हैं, तो या तो 32 बिट पुस्तकालय लिंक या निम्न कोड का उपयोग करें:

#cpuid using C library Functions 
.section .data 
output: 
.asciz "The Processor Vendor ID is '%s'\n" 
.section .bss 
.lcomm buffer, 12 
.section .text 
.globl main 
main: 
movq $0, %rax 
cpuid 
movq $buffer, %rdi 
movq %rbx, (%rdi) 
movq %rdx, 4(%rdi) 
movq %rcx, 8(%rdi) 
movq $buffer, %rsi #1st parameter 
movq $output, %rdi #2nd parameter 
movq $0, %rax 
call printf 
addq $8, %rsp 
pushq $0 
call exit 
+0

आपके movq निर्देश '(% rdi)' में वृद्धि नहीं करते हैं, इसलिए जब तक कि मुझे कुछ याद नहीं आ रहा है, 'movq $ buffer, (% rdi)' को आपके 'movq $ output,% rdi' द्वारा कुछ ओवरराइट किया जा रहा है बाद में लाइनें मैं देख सकता हूं कि आप क्या कर रहे हैं, लेकिन आप '% rdi' का उपयोग क्यों करते हैं जब आप अभी भी '$ बफर' से'% आरएसआई 'की प्रतिलिपि बनाने जा रहे हैं, फिर भी कुछ लाइनें? – querist

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