与时间相关的中断不';不能在汇编中工作,在Windows中?

与时间相关的中断不';不能在汇编中工作,在Windows中?,windows,assembly,dos,machine-code,Windows,Assembly,Dos,Machine Code,我想用汇编语言创建一个小程序,它会延迟几秒钟 我正在使用Windows XP SP3,打开了一个DOS窗口,并运行了debug.exe 我参加了这个简短的装配程序: MOV-CX,3D 莫夫DX,0900 莫夫啊,86岁 INT 15 功能86h在中断15h中执行延迟, 延迟的持续时间以CX,DX为单位,以微秒为单位 例如,如果我想延迟4秒,那么它是4000000微秒=3D0900h, 这就是我放在CX,DX里的东西 不幸的是,运行这个短程序不会执行任何延迟, 它立即退出 然后我尝试了另一个中断

我想用汇编语言创建一个小程序,它会延迟几秒钟

我正在使用Windows XP SP3,打开了一个DOS窗口,并运行了debug.exe

我参加了这个简短的装配程序:

MOV-CX,3D

莫夫DX,0900

莫夫啊,86岁

INT 15

功能86h在中断15h中执行延迟, 延迟的持续时间以CX,DX为单位,以微秒为单位

例如,如果我想延迟4秒,那么它是4000000微秒=3D0900h, 这就是我放在CX,DX里的东西

不幸的是,运行这个短程序不会执行任何延迟, 它立即退出

然后我尝试了另一个中断功能:

函数编号0在中断1Ah中,将PC的时钟计数返回到CX,DX。 每个滴答声为1/18.2秒

然后我进入并运行了这个简短的程序:

莫夫啊,0

INT 1A

但不幸的是,CX和DX在运行后都等于0000h

有没有一个原因可以解释为什么两个与时间相关的中断在Windows中不起作用? 似乎其他中断也能起作用

我能做些什么让它们工作,这样我就能实现我想写的小延迟程序了吗


谢谢你

奥马尔,我在CodeReview上找到了一个很好的解决延迟问题的方法。
它直接使用地址0040h:006Ch处的BIOS timer tick变量,而不是通过int 1Ah上的函数00h询问它的值

请看一看

您不能在保护模式下调用BIOS功能(软件中断)。如果你运行DOS仿真器(比如DOSbox),它们可能在那里工作。谢谢潜伏者。那么,也许还有其他方法可以延迟组装?对于如何实现它,我是灵活的,只要我实现了延迟,并且在不同的机器上它可以是相同的延迟(速度可以不同,因此简单地在NOP命令上循环1000000次不会是相同的延迟。)@潜伏者:这只是事实的一半。在Windows Vista的32位版本中,Windows可以在“虚拟8086模式”下运行DOS程序。据我所知,在本例中使用了PC的原始BIOS,因此一条名为“INT”的指令称为PC的原始BIOS功能。然而,I/O访问以及硬件中断总是由操作系统在“虚拟8086模式”下进行模拟。@MartinRosenau很有趣。我知道uP有一个虚拟的8086模式,但我不知道Windows也有一个。但是听起来这对Windows7和更高版本来说是不适用的。Omer,你可以在WindowsAPI调用中查找延迟并调用它。有大量关于从汇编到Windows API接口的在线信息。