1
我有一个GNU C程序下面的代码:如何将64位指针移入RAX寄存器?
void *segment = malloc(1024);
asm volatile("mov $%0, %%rax" : : "r" (segment));
而且我得到以下错误:
Error: illegal immediate register operand %rax
有什么不对%rax
?
我有一个GNU C程序下面的代码:如何将64位指针移入RAX寄存器?
void *segment = malloc(1024);
asm volatile("mov $%0, %%rax" : : "r" (segment));
而且我得到以下错误:
Error: illegal immediate register operand %rax
有什么不对%rax
?
虽然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的东西,你还需要提供更多的细节来获得更有用的答案。
代码有什么问题......因为你可以改为'asm(“”::“a”(segment));' - 也就是说,不需要直接将任何东西直接移动到'%rax'中寄存器修饰符'“a”'说“我希望这个值在'[ER] AX'中传递/返回”。上面的程序集没有意义 - 编译器会抛出它。请澄清你想用'RAX'中的值做什么。 –