【问题标题】:Do 16-bit programs run in Virtual 8086 Mode on a 32-bit OS?16 位程序是否在 32 位操作系统上以虚拟 8086 模式运行?
【发布时间】:2017-02-02 21:19:12
【问题描述】:

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

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

PWB

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

【问题讨论】:

  • 附带说明,如果您发现需要对代码运行的环境进行更多控制,您可能需要考虑使用虚拟机。

标签: windows assembly command virtual x86-16


【解决方案1】:

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

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

我还应该注意,由于您使用的 CodeView 版本也是一个 MS-DOS 应用程序,因此它也作为虚拟 8086 模式下的应用程序运行,使用与被调试程序相同的实际 CPU 寄存器。这意味着当 CodeView 显示被调试程序的寄存器时,它显示的是在程序停止和 CodeView 接管时寄存器中的值。 CodeView 需要这些寄存器供自己使用,所以当它获得控制权时,它做的第一件事就是将调试过的程序寄存器保存在内存中的某个地方。

【讨论】:

  • 我没有使用调试器的经验。请验证以下陈述。 1)指令在代码视图中实际上是由处理器执行的。 2)它也将寄存器用于自己的用途。因此,调试器中显示的某些寄存器的值与寄存器中的实际值不同。 3) mov AX,0 执行后,CV 可以将 AX 的值移动到内存中,并为自己的目的使用 AX 寄存器。 4)调试器中显示的内存内容实际上存在于物理内存中,尽管在不同的位置..
  • @user2277648 1) 是的,2) 在显示时它们是不同的 3) 在执行 MOV 指令后,如果 CPU 进入调试器(例如,由于断点,或单步),然后调试器会将寄存器的内容保存在内存中 4)内存内容可能在某处的物理 RAM 中。它们需要让调试器读取内容并显示它们,但 Windows 可以将内容保存到磁盘上的交换文件中,以便为 RAM 中的其他内容腾出空间。当再次访问时,Windows 可以透明地将内存复制回
  • 最后一件事,上述场景(4 点)对于 gdb 调试器是否也一样? gdb 调试器是否也在真实处理器上执行指令?我读到一些调试器检查指令集模拟器上的代码。
  • @user2277648 GDB 很相似,但有一点不同,因为它运行在比 MS-DOS 更复杂的操作系统下。由于它在与被调试程序不同的进程中运行,因此实际上是操作系统将寄存器保存在内存中。 GDB 不能直接访问它们,这与在 MS-DOS 下运行的 CodeView 不同。 GDB 还支持远程调试,其中 GDB 在与被调试程序不同的计算机上运行。这用于各种情况,例如调试在智能手机、微控制器和虚拟机上运行的程序。
猜你喜欢
  • 2010-11-07
  • 2012-11-17
  • 2012-07-26
  • 2015-09-26
  • 2023-03-12
  • 2020-01-07
  • 1970-01-01
  • 2012-05-09
  • 2011-10-11
相关资源
最近更新 更多