0

我有一个用于 MS-DOS 的 Hello, World 程序,它使用 int 21h 进行系统调用。

mov dx,hello
mov ah,9
int 0x21
mov ah,0
int 0x21

"hello" 是字符串 'hello, world',13,10,'$' 的地址。

该程序有效。

但是,当我将(第一个)“int 0x21”替换为“call 5”时,程序会导致计算机崩溃(即运行 PTS-DOS 的 VirtualBox 虚拟机)。在 DOSbox 上,它只是终止并返回到命令提示符。

我尝试对地址和电话号码使用不同的寄存器,但总是得到相同的结果。

现在我想知道...

  1. 难道以后的DOS不再支持CP/M兼容调用5接口了吗?
  2. PTS-DOS 和 DOSbox 中的 DOS 不支持 call 5 吗?
  3. 我是不是用错了界面?
  4. 我必须先配置段寄存器吗?(我尝试将所有段寄存器设置为零。)

有任何想法吗?

更新:我接受了答案,因为根据文档它是正确的。它仍然不起作用,但这可能是由于我的 DOS 版本或其他一些问题。

4

3 回答 3

4

DOSBox 不支持 CALL 5。从其源代码

// lets hope nobody really uses this address
sSave(sPSP,cpm_entry,RealMake(0xDEAD,0xFFFF));
于 2016-10-08T22:09:35.463 回答
1

我不希望旧的“CALL 5”界面与 DOSBox 一起使用,因为它只尝试模拟游戏中使用的东西,而且很可能没有 MS-DOS 游戏使用它。这个晦涩的接口只是为了更容易地将 CP/M 程序移植到 MS-DOS,它本质上只是其原始版本中的 CP/M 克隆。同样,如果在其他模拟环境或 MS-DOS 克隆中不起作用,我也不会感到惊讶,因为它们并不真正需要它。

如果你想使用像这样深奥的东西,你应该使用真正版本的 MS-DOS。您可能还需要使用真正的 PC,因为即使是像 VirtualBox 这样的虚拟机也会遗漏人们实际使用它的程序不需要的东西。

然而,即使在真实 PC 上的真实 MS-DOS 上,使用 CALL 5 兼容接口时也存在一些限制:

  • 正如 Micheal 在评论中指出的那样,函数编号需要在 CL 而不是 AH 中加载。
  • CS 必须指向 PSP。换句话说,它只适用于 .COM 程序。需要设置 .EXE 格式的可执行文件才能像 .COM 文件一样运行才能正常工作。
  • 您不能加载 HIMEM.SYS 或任何其他可以启用 A20 线的内容。PSP:0005 处的远跳转指令依赖于实际 8086 CPU 的 1MB 地址换行。PSP:0006 处远地址的低位字设置为 CP/M 兼容性在 PSP 段中分配的空间量。这意味着远地址通常类似于 F01D:FEF0,因此它会跳转到 0000:00C0(INT 30 向量),然后跳转到实际的 MS-DOS 入口点。
  • 你不能使用 DEBUG 来运行你的程序。自 2 以来 MS-DOS 包含的所有 DEBUG 版本都有一个错误,即他们在 PSP 中放置了错误的地址。
  • 您只能使用函数编号小于或等于 24h 的旧 MS-DOS 1.x 函数。
于 2016-10-09T22:52:08.787 回答
0

是否有一个版本的 DOS,您实际上已经看到了 CP/M“调用 5”的工作?我从 DOS 2.1 开始,但确实为 1.1 编写了一些代码,我看到的唯一 CP/M 兼容性是在 FCB 中。当然,我并没有明确地寻找它,但我不记得有人报告说“呼叫 5”得到了任何人的支持......

跟进:

最新的 PSP 定义(如网络上列出的,因此 YMMV)确实具有支持的“调用 5”接口。任何真正的 DOS 兼容环境都应该支持它。

于 2013-05-21T12:03:30.810 回答