我在GNU C程序中有以下代码:
void *segment = malloc(1024);
asm volatile("mov $%0, %%rax" : : "r" (segment));
我收到以下错误:
Error: illegal immediate register operand %rax
%rax
有什么问题?
答案 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的实验,您还需要提供更多详细信息以获得更有用的答案。