繁体   English   中英

GCC内联汇编:调用dword ptr

[英]GCC Inline-assembly: call dword ptr

如果我在Windows VC ++中有以下代码:

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

如何使用AT&T语法在GCC内联汇编中做同样的事情?

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

我尝试过类似的东西,但它会产生“垃圾”错误......

然后我尝试将somevar传递给某些寄存器,然后将其转换为dwordptr等,但我无法使其工作。

更新:我发现的东西是有用的,像我们似乎不得不使用括号,而不是括号在这种情况下,我发现的东西lcall为调用far 但我仍然无法理解我如何重现dword ptr

您不使用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&T语法。 也尝试谷歌一些介绍,如:

警告:使用gcc进行内联汇编并非易事。 这是因为除了大多数其他编译器之外,它还可以优化器一起使用。 你必须真正理解约束(“r”)的意思和作用,否则你将以你无法想象的方式破坏你的代码。 在你能回答“早期的咒语”之前,甚至不要考虑使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM