使用int 0x20和int 0x21/ah = 0x4C退出16位汇编程序有什么区别?

Ass*_*him 5 x86 assembly dos

在不同的时间,我使用过两者

int 0x20
Run Code Online (Sandbox Code Playgroud)

mov ah, 0x4c
int 0x21
Run Code Online (Sandbox Code Playgroud)

作为结束16位汇编程序的方法.

但这两者有什么区别?


编辑:感谢大家的评论.继Alexey对PSP(程序段前缀)的引用后,从Microsoft MASM支持中获得了这个金块.

文章似乎表明,除了返回代码之外,还有更多不同之处.

很高兴将接受的答案授予任何能够将两者更加明确地结合在一起的人.

nin*_*alj 14

首先,一些背景.DOS使用中断21h进行系统调用.AH用于解复用INT 21h提供的各种功能.当程序执行时,DOS将其置于256字节之前,称为PSP(程序段前缀),其中包含有关该过程的信息.

DOS中的原始退出功能是INT 21/AH=00.现在,显然DOS开发人员决定从程序返回应该是一种退出程序的方法(这是来自CP/M吗?).RET(附近)从堆栈中弹出一个单词并跳转到它.因此,在创建程序时,其堆栈以单词开头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个字节.

[编辑: DOS程序结构的插图,使用<code> debug </ code>

历史记录:在CP/M上,退出程序有3种方法:

  • 调用BDOS函数0(相当于INT 21 AH = 00h,DOS函数0)
  • 跳转到0000h的WBOOTF位置(相当于PSP偏移000h)
  • 回国

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重新加载部分OS.


Eri*_* J. 6

后者int 0x21允许您指定返回码.

返回码放在寄存器AL中.

http://spike.scu.edu.au/~barry/interrupts.html#ah4c

  • @AKE在.COM程序中,您也可以执行`RET`退出(前提是您没有任何东西仍未从堆栈中取消,并且您没有损坏任何结构).`RET`将控制转移到`int 0x20`. (2认同)
  • @AKE:你刚写了'mov ah,0x09`?也许你的意思是'mov ah,0x4c`,或者更好的是,'mov ax,0x4c00`. (2认同)