2014-04-11 83 views
1

我有一个GNU C程序下面的代码:如何将64位指针移入RAX寄存器?

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

而且我得到以下错误:

Error: illegal immediate register operand %rax 

有什么不对%rax

+0

代码有什么问题......因为你可以改为'asm(“”::“a”(segment));' - 也就是说,不需要直接将任何东西直接移动到'%rax'中寄存器修饰符'“a”'说“我希望这个值在'[ER] AX'中传递/返回”。上面的程序集没有意义 - 编译器会抛出它。请澄清你想用'RAX'中的值做什么。 –

回答

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的东西,你还需要提供更多的细节来获得更有用的答案。