如何将64位指针移入RAX寄存器?

时间:2014-04-11 16:06:20

标签: gcc 64-bit inline-assembly

我在GNU C程序中有以下代码:

void *segment = malloc(1024);
asm volatile("mov $%0, %%rax" : : "r" (segment));

我收到以下错误:

Error: illegal immediate register operand %rax

%rax有什么问题?

1 个答案:

答案 0 :(得分:0)

虽然FrankH的观点是有效的,严格来说这个错误的原因是美元符号。汇编程序中的美元符号用于表示常量。所以" mov $ 1,%% eax"会工作。但是,您的代码会生成:

mov $%rax, %rax

$%rax无意义并产生错误。这将解决错误:

void *segment = malloc(1024);
asm volatile("mov %0, %%rax" : : "r" (segment));

由于malloc将在rax中返回其值,因此(很可能)会生成" mov%rax,%rax"。

换句话说,它仍然没有意义,不安全和低效,但它会编译而不会出错。

假设此代码不仅仅是为了教您使用asm的实验,您还需要提供更多详细信息以获得更有用的答案。