如何使用内联汇编在C/C++程序中调用DOS中断?

Roc*_*r90 2 c++ assembly dos interrupt

我需要从C/C++程序调用一些DOS中断(服务),我尝试了以下内联asm代码:(读取一个字符)

int main()
{
asm(
 "movb $0x01, %ah;"
 "int $0x21"
 );
system("PAUSE");
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用!我想知道我在这里做错了什么!另外如果有另一种方法来调用dos中断!谢谢 !

Jer*_*fin 9

你只能使用DOS程序的DOS中断,所以为了使这个工作,你需要一个非常古老的C++编译器,如Visual C++ 1.0或1.5,或Turbo C++/Borland C++,通过类似4.5或5.0的东西.然后你必须修复你的汇编代码 - 你所编写的内容看起来像AT&T语法,但我所知道的所有DOS编译器都使用Intel语法.有一个半例外:djgcc.这是一个古老版本的gcc,它运行在DOS扩展器下,所以它使用AT&T语法,并且仍然支持一组类似DOS的中断(虽然你真的使用DOS扩展器,而不是DOS本身).

即使这样,该程序也只能运行在支持DOS程序的系统上(而且微软正在迅速从Windows中删除它 - 例如,它在所有x64版本的Windows中都不存在).

DOS已经过时了,为它编写新代码没有意义.如果你想读取这样的键,写一个Windows程序,然后使用类似的东西ReadConsoleInput.

编辑:好的,如果你真的想这样做,显而易见的方法是选择一个DOS扩展器并将当前版本的gcc移植到它.另一种可能性是选择一个像OpenWatcomDigital Mars这样的编译器,它仍然被维护并已经移植到DOS扩展器.