我试图弄清楚如何在下面的内联汇编代码中使用变量 ret,但我不断收到此错误:未定义对 'ret 的引用。
char getkey(void){
int ret;
asm(
"movq $0, %RAX\n\t"
"INT $0X16\n\t"
"movq %RAX, ret"
);
return ret;
}
我试图弄清楚如何在下面的内联汇编代码中使用变量 ret,但我不断收到此错误:未定义对 'ret 的引用。
char getkey(void){
int ret;
asm(
"movq $0, %RAX\n\t"
"INT $0X16\n\t"
"movq %RAX, ret"
);
return ret;
}
你试图做的事情是行不通的。PC BIOS 中断,如 int 16h,仅在系统以实模式运行时可用(即,在启用 MMU 之前的启动时);它们不能在 Linux 可执行文件中使用。
话虽如此,一般来说,您可以使用gcc assembler constraints指定一个输出寄存器。例如:
asm(
"movq $0, %RAX\n"
"int $0x16\n"
: "=a" (ret)
);
mov
请注意,此代码末尾没有说明!约束告诉编译器结果将"=A"
留在 A 寄存器中;它会从那里弄清楚该怎么做。mov
(如果你聪明的话,也有办法消除第一个。)