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