如何将 64 位指针移入 RAX 寄存器?

Posted

技术标签:

【中文标题】如何将 64 位指针移入 RAX 寄存器?【英文标题】:How to move a 64bit pointer into the RAX register? 【发布时间】:2014-04-11 16:06:20 【问题描述】:

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

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

我收到以下错误:

Error: illegal immediate register operand %rax

%rax 有什么问题?

【问题讨论】:

代码有什么问题...从不需要直接将任何内容显式移动到%rax,因为您可以改为使用asm("" : : "a"(segment)); - 即使用寄存器修饰符"a" 表示“我希望在[ER]AX 中传递/返回此值”。上面的程序集是没有意义的——编译器会把它扔掉。请说明您想对RAX 中的值做什么。 【参考方案1】:

虽然 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 的知识,你需要提供更多细节以获得更有用的答案。

【讨论】:

以上是关于如何将 64 位指针移入 RAX 寄存器?的主要内容,如果未能解决你的问题,请参考以下文章