2011-12-23 6 views
8

मैं डीपरिवर्तित मदद: __asm__ __volatile__

static __inline void outb (unsigned char value, unsigned short int port) 
{ 
    __asm__ __volatile__ ("outb %b0,%w1" 
          : 
          : 
         "a" (value), 
          "Nd" (port)); 
} 

को पोर्ट सी outb समारोह चाहते हैं यह डी संस्करण है।

extern(C) 
{ 
    void outb (ubyte value, ushort port) 
    { 
     // I couldn't figure out this part 
    } 

} 

ये विषय के बारे में कुछ लिंक हैं।

डी इनलाइन असेंबलर

http://dlang.org/iasm.html

जीसीसी-इनलाइन-विधानसभा-विधिपत्र

http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

लेकिन मैं विधानसभा भाषा नहीं जानते तो मैं कुछ मदद की जरूरत है। किसी भी सहायता की सराहना की जाएगी। धन्यवाद।

उत्तर

8

outb निर्देश केवल outb %al, %dx के रूप में जाना जाना चाहिए जहां %al मान है और %dx पोर्ट है।

डी x86 के लिए इंटेल सिंटैक्स का उपयोग करता है, जीएनयू असेंबलर के विपरीत जो डिफ़ॉल्ट रूप से एटी & टी वाक्यविन्यास का उपयोग करता है। इसी इंटेल वाक्य रचना out dx, al होगा, और डी में इसी कोड दिखाई देगा:

void outb (ubyte value, ushort port) 
{ 
    asm { 
     mov AL, value; 
     mov DX, port; 
     out DX, AL; 
    } 
} 

ध्यान दें कि आप क्योंकि druntime core.bitop.outp समारोह है जो एक ही अनुदेश प्रदर्शन किया है, सब पर विधानसभा में लिखने के लिए जरूरत नहीं है।

void outb (ubyte value, ushort port) 
{ 
    import core.bitop; 
    outp(port, value); 
} 
4

पहली बात यह है कि शायद आप ट्रिपिंग है ऊपर है कि डी संकलक के opcodes की समर्थित सूची outb शामिल नहीं है, के रूप में सी समारोह आपके द्वारा दी गई द्वारा निर्दिष्ट है। कुछ खोदने के बाद, मुझे पता चला है कि outb सामान्य ओपोड out के लिए एक और विशिष्ट नाम है। outb इंगित करता है कि opcode के लिए पहला तर्क एक बाइट रजिस्टर में रखी जाएगी (जैसा कि outw और outl है, जो क्रमश: एक शब्द और एक डबल शब्द का एक पहला तर्क आकार से संकेत मिलता है के खिलाफ), तथापि, डी संकलक opcode का उपयोग करता है सभी परिचालनों के लिए out, और निर्धारित करता है कि आपके द्वारा निर्दिष्ट तर्क के आकार के आधार पर कौन सा विशिष्ट ऑपोड लिखना है।

कि रास्ते से बाहर के साथ

, ऐसा करने के लिए अगली बात डी वाक्य रचना करने के लिए जीसीसी वाक्य रचना कन्वर्ट करने के लिए है। जीसीसी-इनलाइन-विधानसभा-विधिपत्र के अनुसार, कोड आपके द्वारा दी गई बढ़ाया विधानसभा सिंटैक्स का उपयोग करता:

asm (assembler template 
    : output operands     /* optional */ 
    : input operands     /* optional */ 
    : list of clobbered registers  /* optional */ 
    ); 

अपने टेम्पलेट को देखते हुए, समारोह एक विधानसभा अनुदेश (outb) दो तर्कों, निर्दिष्ट करता है पहले किया जा रहा है एक बाइट (%b0) और दूसरा शब्द या लघु पूर्णांक (%w0) है।

इनपुट तर्क सूची के बारे में मुश्किल बिट श्रृंखला है कि आपके समारोह मापदंडों में से प्रत्येक के उपसर्ग है। हाउटो के अनुसार, इन्हें बाधा कहा जाता है। वे अनिवार्य रूप से नियम हैं कि जीसीसी को प्रदत्त असेंबली निर्देशों के तर्क के रूप में मानकों का उपयोग करने में पालन करना होगा।"a"value पैरामीटर पर लागू होता है इंगित करता है कि परिवर्तनीय की सामग्री को eax, ax, या al में चर के आकार के आधार पर रखा जाना चाहिए। port परिवर्तनीय, "Nd" पर बाधा, पहले इंगित करती है कि मान 0-255 की सीमा में है, और दूसरा, मान को edx, dx, या dl पर फिर से दर्ज किया जाना चाहिए, फिर से आकार के आधार पर चर।

डी कंपाइलर असेंबली ब्लॉक में चर के साथ जितना अधिक सहायता प्रदान नहीं करता है, जीसीसी करता है; डी के इनलाइन असेंबलर में, आपको विशेष रूप से उचित रजिस्टरों में पैरामीटर के मानों को स्थानांतरित करने की आवश्यकता होगी। outb के लिए, ये पंजीयक dx और al हैं। D के इनलाइन विधानसभा वाक्य रचना के बाद, आप चर ले जाएँ और इस प्रकार out opcode कॉल कर सकते हैं:

asm 
{ 
    MOV AL, value; 
    MOV DX, port; 
    OUT DX, AL; 
} 

ध्यान दें कि, क्योंकि जीसीसी एटी & टी कोडांतरक सिंटैक्स का उपयोग करता है, और डी इंटेल कोडांतरक वाक्य रचना, के आदेश का उपयोग करता है OUT पर प्रदान किए गए तर्क उलट दिए गए हैं।

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