2010-08-10 170 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”)的含义和意义,否则你会以你无法想象的方式破坏你的代码。在回答什么是“早期破坏者”之前,甚至不要考虑使用它。