如何将 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 位整数寄存器?
如何仅使用 64 位寄存器在 64 位寄存器中存储 1 个字节值?