16位程序是否在32位操作系统上以虚拟8086模式运行?

时间:2016-09-25 13:40:02

标签: windows assembly command virtual x86-16

我想确认一些事情。我正在为8086制作汇编语言程序。 我正在使用masm611汇编程序进行组装。如果我在32位窗口的命令提示符下运行并调试8086 16位实模式程序,它是否使用和修改实际的cpu寄存器和内存?该程序是否在Windows 32bit下的虚拟模式下运行?

另外,如果我使用PWB Microsoft Programmers'Workbench中的CodeView调试器调试程序,如下所示:

PWB

8086 assembly language program with debugger running http://i65.tinypic.com/35cej2e.jpg

请确认CodeView调试器中的寄存器和内存值是否为硬件中的实际值并且正在更改。此外,当我在PWB中运行程序时,它使用Windows 32位下的实际硬件。

1 个答案:

答案 0 :(得分:5)

当您从32位版本的Windows下的Windows命令提示符运行MS-DOS程序时,它在NTVDM下运行,它使用虚拟8086模式模拟实模式。该程序在运行时正常使用CPU的寄存器。但是,它不会以与在实模式下运行的代码相同的方式使用内存。

Windows不提供NTVDM,并且在其下运行的任何程序都可以直接访问物理内存,就像它没有任何其他Windows应用程序直接访问一样。而是程序对存储器的访问通过页表从线性地址转换为物理地址。这意味着如果您的MS-DOS应用程序写入内存位置074B:0000,CPU将其转换为线性地址000074B0,然后通过页表查找将其转换为Windows选择的完全不同的物理地址。 Windows也不允许NTVDM或在其下运行的应用程序直接访问设备硬件,因此任何对设备内存的访问都将被NTVDM阻止或模拟。

我还应该注意,由于您使用的CodeView版本也是MS-DOS应用程序,它也在虚拟8086模式下作为应用程序运行,使用与正在调试的程序相同的实际CPU寄存器。这意味着当CodeView显示调试程序的寄存器时,它显示程序停止时CodeView接管时寄存器中的值。 CodeView需要寄存器供自己使用,因此它获得控制时首先要做的是将调试的程序寄存器保存在内存中。