【问题标题】:From DOS to Windows 10 assembly [duplicate]从 DOS 到 Windows 10 程序集 [重复]
【发布时间】:2016-08-25 20:39:12
【问题描述】:

此代码将打印“Hello, world!”在 DOS 中作为 .COM 可执行文件:

org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, world!',0Dh,0Ah,'$'

但是,它不会在 Windows 10 64 位上运行,而且我见过的 x86x64 的 Helloworld 程序的所有简单示例都涉及链接到某个库。

所以我的问题是,这些更高版本的 Windows 是否仍然遵循 ISR IO 模型,或者更简单地说,我如何将此示例转换为“更高位”?

【问题讨论】:

  • 如果你在完成基本的组装,在 Dosbox 或其他模拟器上运行可能会更好。
  • 没有。 DOS 在将近 20 年前就死了,你不能在现代版本的 Windows 上运行这种类型的代码。所以我如何转换这个程序的答案是你不需要。进入本世纪。
  • 是的,你必须重新开始学习 Windows API
  • 中断 21h 是一个 DOS 函数。任何阅读“Mastering Turbo Assembler”(Tom Swan) 的人也会想使用 BIOS 调用,例如 INT 10h。见:en.wikipedia.org/wiki/INT_10H
  • 看到这个答案:stackoverflow.com/a/1032422/54937

标签: windows assembly x86 64-bit executable


【解决方案1】:

您不仅不能在 Windows 10 中这样做,而且实际上在任何以保护模式运行应用程序的 Windows(Windows NT 3 和更高版本)中都不能这样做 - 应用程序无法直接访问中断和硬件。此外,可执行格式本身是依赖于操作系统的。虽然有一些向后兼容性(例如 Win10 应该能够运行 Win7 应用程序),但它肯定不会追溯到 DOS 时代(.COM 格式根据定义仅限于实模式,在 Win NT 3 之前就死了)。

没有直接的方法可以将此代码转换为与 Win10 兼容。您需要使用操作系统提供的 API 来访问中断/硬件。

【讨论】:

  • 这个答案有些不正确。 64 位版本的 Windows(不仅仅是 Win10)不支持 NTVDM,它是一个为 16 位和 32 位 DOS 程序(exe 和 com)提供有限支持的 dos 虚拟子系统。但是,此时所有版本的 32 位 Windows 都支持 NTvDM。在 Windows 10 32 位(我知道 OP 没有使用它,我只是提供信息)上,您可以通过 Programs and Features / Turn Windows Features on or off / Legacy Components / Enable NTVDM 打开该功能。在 64 位 Windows 上,您可以使用虚拟机软件运行 32 位操作系统(或 DOS),或使用 DosBOX 之类的模拟器。
  • 我评论的最后一部分涉及第 3 方解决方案。自 WinNT 早期以来,NTVDM 一直是 32 位 Windows 的 Windows 子系统,其存在是为了允许 Windows 使用 16/32 位 DOS 程序。 NTVDM 提供了一组 API(恰好看起来和行为类似于 DOS/BIOS 中断),这些 API 被处理并在需要时传递给 Windows 内核。在带有 NTVDM 的系统上,Windows 可以理解 16/32 位 DOS EXE 和 COM 程序(32 位 Windows 带有 16 位 dos 调试器)。 NTVDM 不能在 64 位 Windows 上运行的硬件原因是因为 Intel 的 64 位长模式不支持 vm8086。
  • 但在 Win32 的保护模式下,有一个中介(内核)负责设备争用、任务分配、硬件访问。无论是一层还是多层,32位windows天生就支持真实的DOS EXE和COM程序,设置虚拟8086任务,拦截中断请求,行为类似于DOS。有没有2、3、4层的分层都无所谓。 32 位 Windows 支持 16 位和 32 位 DOS EXE 和 COM 程序(32 位通过 dos 扩展程序)。
  • 我没有看到您提到 Win32 32 位代码需要 64 位 Windows 上的 WOW64 兼容层的相同论点。 NTVDM 实际上是一个 WOW32 层。 WOW64只是不需要VM8086任务即可运行。
  • 因为您的回答表明 .COM 格式根据定义限制为实模式,。这是不正确的。 VM8086 支持在 CPU 级别上运行 16 位代码,而无需进入实模式。实模式!= VM​​86。 VM8086 是保护模式,支持 20 位分段模型并且可以本地运行这些指令。 VM8086 中的 DOS/BIOS 中断传递到 Windows 内核,在那里它们被模拟或传递到真实硬件。但这与在 win32 应用程序中进行内核调用的中断机制并没有太大的不同(隐藏在 Win32 API 的外表下)
猜你喜欢
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多