【问题标题】:How to move a 64bit pointer into the RAX register?如何将 64 位指针移入 RAX 寄存器?
【发布时间】: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 中的值做什么。

标签: gcc 64-bit inline-assembly


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

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2012-01-24
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2012-06-25
    相关资源
    最近更新 更多