【发布时间】:2017-07-23 06:22:11
【问题描述】:
大部分汇编代码由以下指令终止
MOV AH, 4CH
INT 21H
“MOV AH, 4CH”是什么意思?
【问题讨论】:
-
这里我要求“MOV AH, 4CH”,而不是 INT 21H。 “INT 21H”也随之而来。
标签: assembly dos x86-16 instructions
大部分汇编代码由以下指令终止
MOV AH, 4CH
INT 21H
“MOV AH, 4CH”是什么意思?
【问题讨论】:
标签: assembly dos x86-16 instructions
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
提示:显存分为 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
【讨论】:
MOV AH, 4CH 表示将十六进制值4C 存储(或“move”)到registerAH。
(请注意,动词“move”在历史上被使用过,但它是一个非常不幸的动词选择,因为它意味着被移动的东西不再存在于它的旧位置,现在只能在它的新位置,而实际上所有“移动”指令实际上是复制数据。)
INT 21H 表示调用由十六进制数21 标识的interrupt。
显然,某些操作系统(很可能是 MS-DOS,或者现在更可能是模拟 MS-DOS 的系统)捕获调用以中断 21 小时并执行一些与操作系统相关的功能,该功能由寄存器 AH 的值标识.
在MS-DOS 中,在AH = 4Ch 时调用中断21h 会导致当前进程终止,并使用寄存器AL 的值作为进程的退出代码。
【讨论】:
DOS 中断int 21/4Ch 是EXIT - TERMINATE WITH RETURN CODE,al 的内容被用作返回码并且进程被终止。该文档附带以下注释:
除非进程是它自己的父进程(参见#01378 [offset 16h] at AH=26h),所有打开的文件都将关闭并释放属于该进程的所有内存。调用此函数前应解除所有网络文件锁
【讨论】: