如何在内联程序集中使用C中声明的变量



我正试图弄清楚如何在下面的内联汇编代码中使用变量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。)

相关内容

  • 没有找到相关文章

最新更新