我正试图弄清楚如何在下面的内联汇编代码中使用变量ret,但我一直收到这个错误:对'ret'的未定义引用。
char getkey(void){
int ret;
asm(
"movq $0, %RAXnt"
"INT $0X16nt"
"movq %RAX, ret"
);
return ret;
}
您试图做的事情不会奏效。PC BIOS中断,如int 16h,只有当系统在真实模式下运行时(即,在MMU启用之前的启动时)才可用;它们不能在Linux可执行文件中使用。
也就是说,通常,您可以使用gcc汇编程序约束来指定输出寄存器。例如:
asm(
"movq $0, %RAXn"
"int $0x16n"
: "=a" (ret)
);
请注意,此代码末尾没有mov
指令!"=A"
约束告诉编译器结果将留在A寄存器中;它会想办法从那里做什么。(如果你很聪明的话,还有一些方法可以消除第一个mov
。)