Gcc 如何将64位指针移动到RAX寄存器中?

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

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

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
中的值。