在不同的时候,我都用过
int 0x20
和
mov ah, 0x4c
int 0x21
作为结束 16 位汇编程序的方法。
但是这两者有什么区别呢?
编辑:感谢大家的评论。跟进 Alexey 对 PSP(程序段前缀)的引用,从 Microsoft MASM 支持中得到了这个块。
这篇文章似乎表明除了返回码之外还有更多的区别。
很高兴将公认的答案授予任何可以更明确地将两者联系在一起的人。
在不同的时候,我都用过
int 0x20
和
mov ah, 0x4c
int 0x21
作为结束 16 位汇编程序的方法。
但是这两者有什么区别呢?
编辑:感谢大家的评论。跟进 Alexey 对 PSP(程序段前缀)的引用,从 Microsoft MASM 支持中得到了这个块。
这篇文章似乎表明除了返回码之外还有更多的区别。
很高兴将公认的答案授予任何可以更明确地将两者联系在一起的人。
首先,一些背景。DOS 使用中断 21h 进行系统调用。AH 用于解复用 INT 21h 提供的各种功能。执行程序时,DOS 会在其前面放置 256 个字节,称为 PSP(程序段前缀),其中包含有关进程的信息。
DOS 中的原始退出函数是INT 21/AH=00
. 现在,显然 DOS 开发人员决定从程序返回应该是退出程序的一种方式(这是来自 CP/M 吗?)。RET
(near) 从堆栈中弹出一个单词并跳转到它。所以,当一个程序被创建时,它的堆栈以一个单词开头0000
。这是 PSP 的开始。所以,在 PSP 的开始有终止程序的代码。为了使该代码保持较小,请INT 20h
充当MOV AH,00h ; INT 21h
.
[编辑:这可以在下面的屏幕截图中看到。]
DOS 2.0 继承了 Unix 的许多东西,包括返回码。因此,出现了一个新的 INT 21h 函数INT 21h/AH=4ch
,它需要一个返回码将其返回给操作系统。此功能还设计用于处理 EXE 文件(AFAIR 也是 DOS 2.0 中的新功能),它可以有多个段。前面的退出函数(INT 20h 和 INT 21h/00)假设 CS 与 COM 程序的程序启动时相同,即它指向程序之前的 PSP 256 字节。
[编辑:
历史注释:在 CP/M 上,退出程序有 3 种方式:
WBOOTF 位置由 3 个字节组成:1 个字节用于跳转,2 个字节用于跳转目标(BDOS 中的 WBOOT 函数)。
在 CP/M 的早期版本中,调用 BDOS 函数 0 或跳转到 WBOOT 会导致部分 CP/M 从磁盘重新加载(热启动),并且随后运行一些 OS 初始化;而 RETurning 则直接返回到 CCP(Console Command Processor,相当于 COMMAND.COM),然后提示输入下一个命令行。AFAIU, CP/M 3 通常加载到 ROM 中,然后返回到 WBOOT 位置,导致从 ROM 重新加载部分操作系统。
这是我所知道的。
MOV AH, 0x4C
INT 0x21
结束正在运行的EXE文件,EXE文件必须这样结束,因为codesegment寄存器CS。如果我错了,请纠正我,但如果你以这种方式结束 COM 文件,你会得到意想不到的结果(崩溃、挂起、重新启动等)。所以
INT 0x20
结束一个 COM 文件。
CS 与 COM 程序在程序启动时相同,即指向程序之前的 PSP 256 字节。(CodeSegment InstructionPointer CS:IP, CS 包含代码段)。是的,我们正在谈论寄存器,变量它们就像一个橱柜,我的工作就像你可以把东西正确地放在抽屉里一样。AX=0000 BX=0000 CX=0000(CX由CL和CH组成)等。
我认为 COM 文件通常总是限制为 64K。我认为的第二个原因是 COM 文件没有数据段,它们确实有数据,但它与代码位于同一段中。我以为他们除了 CODE 没有任何段,COM 文件中的所有数据都存储在 64K 内。EXE 文件确实有一个段,某些 EXE 文件在使用正确的内存模型时可以有更多的段 (CS:IP)(请参阅英特尔内存模型)。
CS=DS=SS
DS=SS
DS=SS
,多个代码段使用内存模型 SMALL 的 EXE 文件有 64K 的限制。当使用更大的内存模型和远 32 位指针时,您可以寻址超过 64K(仍然有限)。我认为这就是“诀窍”。
现在每个人都在抱怨我为什么要使用 EXE 文件。以上是原因。内存模型来自维基百科。对于那些不在乎的人,我从专业人士那里学到了这一点。彼得诺顿和约翰索查。来自 Norton Utilities(The Norton Commander for DOS 背后的人)。他有一本关于组装的书,例如“IBM-PC 的组装”。你应该读它,他解释得最好。他对我来说就像一个好老师。Microsoft CodeView 澄清了我很多。在 DOS C 中编程?Turbo C 2.0 是你能得到的最好的。哦,我不再编程了。