如何将 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 寄存器?的主要内容,如果未能解决你的问题,请参考以下文章

x86_64寄存器rax/eax/ax/al覆盖完整的寄存器内容[重复]

如何将一个 XMM 128 位寄存器拆分为两个 64 位整数寄存器?

Linux系统中x86跟x64的区别是啥

如何仅使用 64 位寄存器在 64 位寄存器中存储 1 个字节值?

如何将 AVX512 寄存器 zmm26 中的 QuadWord 写入 rax 寄存器?

64bit和32bit的处理器有啥区别?