MOV AH, 4CH
INT 21H
"MOV AH, 4CH" 是什么意思?
MOV AH, 4CH
INT 21H
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
的值作为进程的退出代码。
DOS中断int 21/4Ch是EXIT - TERMINATE WITH RETURN CODE,其中al
的内容将作为返回代码,并终止进程。该文档附带以下说明:
除非进程是其自己的父进程(请参见AH=26h时的#01378 [偏移量16h]),否则将关闭所有打开的文件并释放进程所属的所有内存。在调用此函数之前,应删除所有网络文件锁定。
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=6h
,ch
为起始行,cl
为起始列,dh
为结束行,dl
为结束列,al
为行数,bh
为属性值,int 10h
清除定义的区域并在其上写入属性值。
ah=2h , dh=row,dl=column,bh=page number , int 10h
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
4ch
表示该程序应该被终止,并将控制权从程序分配给操作系统。在调用此中断后,内存将被清除。还有一件事:您应始终将此值分配给 AH
寄存器。