如何在内联汇编中使用C中声明的变量

时间:2015-12-29 21:38:06

标签: c gcc assembly keyboardinterrupt

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

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

1 个答案:

答案 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。)