gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:11:52 25 4
gpt4 key购买 nike

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

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

PWB

8086 assembly language program with debugger running

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

最佳答案

当您在 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 需要这些寄存器供自己使用,因此当它获得控制权时,它做的第一件事就是将调试的程序寄存器保存在内存中的某个地方。

关于windows - 16 位程序是否在 32 位操作系统上以虚拟 8086 模式运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39687440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com