-2

我试图弄清楚如何在下面的内联汇编代码中使用变量 ret,但我不断收到此错误:未定义对 'ret 的引用。

char getkey(void){
int ret;
asm(
"movq $0, %RAX\n\t"
"INT $0X16\n\t"
"movq %RAX, ret"
);
return ret;
}
4

1 回答 1

4

你试图做的事情是行不通的。PC BIOS 中断,如 int 16h,仅在系统以实模式运行时可用(即,在启用 MMU 之前的启动时);它们不能在 Linux 可执行文件中使用。

话虽如此,一般来说,您可以使用gcc assembler constraints指定一个输出寄存器。例如:

asm(
    "movq $0, %RAX\n"
    "int $0x16\n"
    : "=a" (ret)
);

mov请注意,此代码末尾没有说明!约束告诉编译器结果将"=A"留在 A 寄存器中;它会从那里弄清楚该怎么做。mov(如果你聪明的话,也有办法消除第一个。)

于 2015-12-29T22:01:32.767 回答