GNU内联汇编来移动数据

时间:2014-03-18 16:50:28

标签: gnu inline-assembly

我想将64位整数写入特定的内存位置。

示例C ++代码如下所示:

extern char* base;
extern uint64_t data;
((uint64_t *)base)[1] = data;

现在,我尝试将上述内容编写为内联汇编:

uint64_t addr = (uint64_t)base + 8; 
asm volatile (
    "movq %0, (%1)\n\t"
    :: "r" (data), "r"(addr) : "memory"
    );

上述工作在一个小型测试程序中,但在我的应用程序中,我怀疑这里有些东西是关闭的。

我是否需要在上面指定任何输出操作数或任何其他约束?

谢谢!

1 个答案:

答案 0 :(得分:0)

请说:

asm("mov %1, %0\n\t" : "=m"(*(uint64_t*)(base + 8)) : "r"(data) : "memory");

棘手的是,当使用"m"约束时,你(可能违反直觉)给出一个地址,而是C中的内容看起来像&#34 ;值"您想要更改的变量 这就是为什么,在这种情况下,奇怪的指针 - 铸造 - 解除引用。为此,编译器确保将操作数的地址放在。