我想将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"
);
上述工作在一个小型测试程序中,但在我的应用程序中,我怀疑这里有些东西是关闭的。
我是否需要在上面指定任何输出操作数或任何其他约束?
谢谢!
答案 0 :(得分:0)
请说:
asm("mov %1, %0\n\t" : "=m"(*(uint64_t*)(base + 8)) : "r"(data) : "memory");
棘手的是,当使用"m"
约束时,你(可能违反直觉)不给出一个地址,而是C中的内容看起来像&#34 ;值"您想要更改的变量
这就是为什么,在这种情况下,奇怪的指针 - 铸造 - 解除引用。为此,编译器确保将操作数的地址放在。