汇编语言中的“MOV AH,4CH”是什么意思?

9
大多数汇编代码都以以下指令终止。
MOV AH, 4CH
INT 21H

"MOV AH, 4CH" 是什么意思?

1
这里我请求的是“MOV AH, 4CH”,而不是INT 21H。INT 21H只是随之而来的。 - Shams Nahid
4个回答

14
在Intel汇编中,MOV AH, something意思是将something存储(或“移动” (w))到寄存器(w)AH位置。 (请注意,“移动”这个动词在历史上被使用,但它是一个非常不幸的选择,因为当你移动某物时,它会停止存在于其旧位置,只能在新位置找到它,而实际上所有“移动”指令实际上都是复制数据:一旦指令完成,该值可以在两个位置找到。令人惊讶的是,在需要如此多逻辑的学科中,人们在使用语言时如此不合逻辑。) 4CH是十六进制数字4C,对应十进制数值76
后缀H表示汇编器应该将数字解释为十六进制。通过要求所有数字无论进制如何,都必须以十进制数字(0-9)开头,避免与寄存器名称(如AH)以及标签(如hash:)混淆。由于AH不以十进制数字开头,因此它不是一个数字。
如果您想要在十六进制中表示十进制数值10,通常只需使用A,但在Intel汇编中,您必须使用0AH。前缀0不会改变数字的值,但它确保数字以十进制数字开头,因此将被解释为数字而不是寄存器AH的名称。这就是回答“在汇编语言中MOV AH, 4CH的意思是什么?”的答案。然而,OP可能并没有想要询问这个在汇编语言中的含义;OP可能想要询问MOV AH, 4CH紧随其后使用INT 21H在MS-DOS中的含义。

所以,答案如下:

INT 21H 意味着调用由十六进制数21标识的中断(w)

MS-DOS(或更有可能的是现在模拟MS-DOS的某些东西)捕获对中断21h的调用,并执行一些依赖于操作系统的功能,该功能由寄存器AH的值标识。

根据MS-DOS API (w),在AH = 4Ch时调用中断21h会导致当前进程终止,并使用寄存器AL的值作为进程的退出代码。


11

DOS中断int 21/4ChEXIT - TERMINATE WITH RETURN CODE,其中al的内容将作为返回代码,并终止进程。该文档附带以下说明:

除非进程是其自己的父进程(请参见AH=26h时的#01378 [偏移量16h]),否则将关闭所有打开的文件并释放进程所属的所有内存。在调用此函数之前,应删除所有网络文件锁定。


1

MOV指令的用法如下:MOV Value1,Value2。 它将Value2值放入Value1中。但是,你不能在内存变量之间移动内容。 可以按以下方式使用此代码:

  • 寄存器到寄存器
  • 寄存器到内存
  • 内存到寄存器

你编写的代码将十六进制的4c(十进制为76)放入ah寄存器中。 你可能会问为什么要这样做? 当我们使用中断时,我们总是需要将一些数字(函数编号)放入ah寄存器中。

ah=4ch int 21h时,程序将控制权转移到操作系统。(结束程序) 而int 21h是一个DOS中断。例如:

ah=9h , dx=offset (string + '$') ,int 21h。将字符串写入光标位置。

ah=6hch为起始行,cl为起始列,dh为结束行,dl为结束列,al为行数,bh为属性值,int 10h清除定义的区域并在其上写入属性值。

ah=2h , dh=row,dl=column,bh=page number , int 10h

提示:视频内存被分为8个页面(0到7)。在这个例子中,我们使用第0页。
程序如下:
datasg segment para 'data'
    msg db 'Hello world$'
datasg ends
codesg segment para 'code'
    example proc far
        assume cs:codesg,ds:datasg    ;lead the assembler to know the segments.
        mov ax,datasg                 ;this is because ds cannot be vaulued directly.
        mov ds,ax                     ;move the data segment offset to its register.
        mov ah,6h
        mov al,25
        mov ch,0
        mov cl,0
        mov dh,24
        mov dl,79
        mov bh,0fh
        int 10h
        mov ah,2h
        mov dh,2
        mov dl,4
        mov bh,0
        int 10h
        mov ah,9h
        mov dx,offset msg
        int 21h
        mov ah,8h
        int 21h
        mov ah,4ch
        int 21h
    example endp
codesg ends
end main

谢谢你的解释,非常感谢。 - Quwaysim
当我们使用中断时,通常需要将某个数字(函数号)放入ah寄存器中。但并非总是如此,例如中断0x11(获取BIOS设备列表)、0x12(获取内存大小)、0x19(系统重启)或0x20(退出到操作系统)。 - Sebastian

-1

4ch 表示该程序应该被终止,并将控制权从程序分配给操作系统。在调用此中断后,内存将被清除。还有一件事:您应始终将此值分配给 AH 寄存器。


1
这似乎没有增加任何之前答案中已经解释过的内容,特别是迈克的答案。在添加您自己的答案之前,请阅读现有的答案。另外,哪些内存将被清除?整个机器吗?不,DOS仍在运行,并且BIOS数据区仍然保存着东西。我认为DOS甚至不知道您的程序写入了哪些内存区域,或者会花时间将它们清零。您的程序不再运行,但是它存储在内存中的字节仍将保留,直到其他东西重用该内存。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接