Gcc 如何将64位指针移动到RAX寄存器中?
我在GNU C程序中有以下代码:Gcc 如何将64位指针移动到RAX寄存器中?,gcc,64-bit,inline-assembly,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有什么问题?虽然FrankH的分数是有效的,但严格地说,这个错误的原因是美元符号。汇编程序中的美元符号用于表示常量。所以“mov$1,%%eax”就行了。但是,您的代码会生成: mo
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的实验,您需要提供更多详细信息以获得更有用的答案。代码有什么问题。。。不需要直接将任何内容显式移动到%rax
,因为您可以改为执行asm(“::”a“(段))代码>-即,使用寄存器修饰符“a”
表示“我希望在[ER]AX
中传递/返回此值”。上面的程序集没有意义-编译器会将其抛出。请澄清您希望如何处理RAX
中的值。