Tor*_*bio 5 c++ linux assembly gcc inline-assembly
如果我在Windows VC++中有以下代码:
DWORD somevar = 0x12345678;
_asm call dword ptr [somevar]
Run Code Online (Sandbox Code Playgroud)
如何使用AT&T语法在GCC内联汇编中做同样的事情?
__asm__ __volatile__ (
"call dword ptr [%%edx]" : :
"d" (somevar)
);
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西,但它会产生"垃圾"错误......
然后我试图通过somevar
一些寄存器,然后将其转换到dword
,ptr
等,但我无法得到它的工作.
更新:我找到了一些有用的东西,就好像在这种情况下我们必须使用括号而不是括号,我找到了一些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));
}
Run Code Online (Sandbox Code Playgroud)
您可以阅读GCC生成的代码(尝试使用-S编译)以了解AT&T语法.也尝试谷歌一些介绍,如:
警告:使用gcc进行内联汇编并非易事.这是因为除了大多数其他编译器之外,它还可以与优化器一起使用.你必须真正理解约束("r")的意思和作用,否则你将以你无法想象的方式破坏你的代码.在你能回答"早期的咒语"之前,甚至不要考虑使用它.
归档时间: |
|
查看次数: |
3071 次 |
最近记录: |