2010-04-26 83 views
2

我需要调用一些DOS从C/C++程序中断(服务),我尝试下面的内联汇编代码: (读取一个字符)如何使用内联汇编在C/C++程序中调用DOS中断?

int main() 
{ 
asm(
"movb $0x01, %ah;" 
"int $0x21" 
); 
system("PAUSE"); 
} 

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

+4

您能详细说明“它没有用吗?”它编译了吗?它崩溃了吗?它运行了,但没有达到预期效果? – 2010-04-26 19:51:08

+0

我对INT 21h函数01h的理解是它应该从标准输入(阻塞直到有一个可用)读取一个字符并将其返回到AL寄存器中。 – 2010-04-26 20:18:59

+0

对不起,详细信息! 我使用代码块作为IDE(所以编译器是GCC),这段代码编译得很好,但执行后它会在一两秒钟后产生一个错误,代码如下:0xc0000005, 我的平台是intel x86上的Windows XP, 谢谢。 – Rockr90 2010-04-26 20:21:58

回答

9

你只能在DOS程序中使用DOS中断,所以要做到这一点,你需要一个真正古老的C++编译器,比如Visual C++ 1.0或1.5,或者Turbo C++/Borland C++,通过类似4.5或者5.0 。然后你必须修复你的汇编代码 - 你写的代码看起来像AT语法,但是我知道的所有DOS编译器都使用Intel语法。有一个例外:djgcc。这是一个在DOS扩展器下运行的gcc的古老版本,因此它使用AT语法,并且仍然支持一组DOS类中断(尽管你真的使用DOS扩展器,而不是DOS本身)。即使如此,该程序也只能运行在支持DOS程序的系统上(并且微软正在迅速从Windows中删除它 - 例如,它在所有x64版本的Windows中都不存在)。

DOS已经过时足够长时间,因此为它编写新代码没有任何意义。如果你想读取这样的密钥,编写一个Windows程序,并使用ReadConsoleInput等代替。

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

+1

我仍然会不时看到使用FreeDOS的新项目(http://www.freedos.org/)。我记得的最后一个是飞行模拟器中的控制装载机。 – 2010-04-26 19:56:50

+0

@Judge Maygarden:我看到很多我不相信的东西。公平地说,我认为一个DOS程序在*有限的情况下可能是有意义的 - 虽然是非正式的,但我能想到的唯一一个是一个硬实时系统,它无法承受Windows不可预测的时间。即使如此,它仍然值得怀疑 - 有比DOS更好的RT/OS。 – 2010-04-26 20:02:13

+0

这是一个实时系统,但我承认我认为这是愚蠢的,当我看到它。尽管FreeDOS的“免费”部分与VxWorks,RedHawk,LynxOS等相比具有吸引力。 – 2010-04-26 20:13:09

0

您可能需要x86仿真器(如DOSBox)才能在Windows XP下运行此代码。

+0

试过了!但它不运行,而是打印一条消息,说“本程序无法在dos模式下运行”不明白问题出在哪里! 谢谢 – Rockr90 2010-04-26 20:54:03

+0

您需要使用上面提到的废弃编译器构建代码,然后在DOSBox或较旧的操作系统下运行它。 – phkahler 2010-04-26 21:32:11