2010-08-10 175 views
5

如果非要在Windows VC++下面的代碼:GCC內聯彙編:調用DWORD PTR

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

我怎樣才能使GCC內聯彙編同樣的事情,與AT & T語法?

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

我已經試過這樣的事情,但它產生的「垃圾」的錯誤...

然後我試圖通過somevar一些寄存器,然後將其轉換爲dwordptr,等等,但我無法讓它工作。

更新:我發現的東西是有用的,像我們似乎不得不使用括號,而不是括號在這種情況下,我發現了一些與lcallfar打電話。但我仍不明白如何重現dword ptr

回答

7

您不使用DWORD PTR或類似的東西與AT & T彙編語法。操作數長度通常取自寄存器名稱(有一個提供助記符後綴的選項),而後者又來自您給asm()的C操作數的大小。這是內聯彙編程序的一個非常好的屬性,因爲這意味着如果爲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)); 
} 

可以讀取代碼GCC生成(嘗試用-S編譯)爲了學習AT &ŧ句法。也可以嘗試谷歌的一些介紹,如:

警告:內聯彙編GCC是不是一件小事。這是因爲,除了大多數其他編譯器之外,它被設計爲與優化器一起工作。你必須真正理解約束(「r」)的含義和意義,否則你會以你無法想象的方式破壞你的代碼。在回答什麼是「早期破壞者」之前,甚至不要考慮使用它。