2010-08-10 10 views
5

अगर मैं विंडोज कुलपति में ++ निम्नलिखित कोड है:जीसीसी इनलाइन-विधानसभा: फोन DWORD ptr

DWORD somevar = 0x12345678; 
_asm call dword ptr [somevar] 

मैं कैसे एटी & टी वाक्य रचना जीसीसी इनलाइन विधानसभा में एक ही बात कर सकते हैं, के साथ?

__asm__ __volatile__ (
    "call dword ptr [%%edx]" : : 
    "d" (somevar) 
); 

मैं कुछ इस तरह की कोशिश की है, लेकिन यह एक "जंक" त्रुटि उत्पन्न ...

और फिर मैं कुछ रजिस्टरों को somevar पास करने का प्रयास करें, और तब dword करने के लिए इसे परिवर्तित, ptr, आदि, लेकिन मैं इसे काम करने के लिए नहीं मिल सका।

अद्यतन: मैं कुछ है कि उपयोगी होगा, ऐसा लगता है जैसे हम उस मामले में कोष्ठक के बजाय कोष्ठक का उपयोग करने के लिए है कि पाया, और मैं lcall साथ कुछ पाया far के रूप में कॉल करने के लिए। लेकिन मैं अभी भी समझ नहीं पा रहा हूं कि मैं dword ptr कैसे पुन: उत्पन्न कर सकता हूं।

उत्तर

7

आप डीडब्ल्यूओआर पीटीआर या एटी & टी असेंबलर सिंटैक्स के साथ ऐसा कुछ भी नहीं उपयोग करते हैं। ऑपरेंड लम्बाई आमतौर पर रजिस्टर नाम से ली जाती है (निमोनिक के साथ प्रत्यय प्रदान करने का एक विकल्प होता है), जो बदले में सी ऑपरेंड के आकार से आता है, आप एएसएम() को देते हैं। यह इनलाइन असेंबलर की एक बहुत अच्छी संपत्ति है क्योंकि इसका मतलब है कि यह उदाहरण चलता है यदि आप इसे x86_64 या i386 आर्किटेक्चर के लिए संकलित करते हैं। पहले मामले में, विधानसभा, call *%rdx की तरह कुछ हो जाता है दूसरे मामले में यह हो जाता है call *%edx:

#include <stdio.h> 
void p() 
{ 
    puts("Hallo"); 
} 
typedef void (*fp)(); 
int main() 
{ 
    fp var=&p; 
    var(); 
    // put 'var' in a register, the '*' says call indirect: 
    asm volatile ("call *%0"::"r"(var)); 
} 

आप पढ़ सकते हैं कोड जीसीसी उत्पन्न आदेश एटी & टी जानने के लिए (एस के साथ संकलन की कोशिश) वाक्य - विन्यास। इसके अलावा, कुछ परिचय गूगल की तरह का प्रयास करें:

चेतावनी: इनलाइन जीसीसी के साथ विधानसभा एक छोटी सी बात नहीं है। ऐसा इसलिए है क्योंकि, अधिकांश अन्य कंपाइलरों के अलावा, यह को अनुकूलक के साथ काम करने के लिए डिज़ाइन किया गया है। आपको वास्तव में समझना होगा कि बाधाओं ("आर") का क्या मतलब है और क्या करना है, अन्यथा आप अपने कोड को उन तरीकों से तोड़ देंगे जिन्हें आप कल्पना नहीं कर सकते। इससे पहले कि आप "प्रारंभिक क्लॉबर" क्या जवाब दे सकें, इसका उपयोग करने के बारे में भी सोचें।