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
3条答案
按热度按时间8zzbczxx1#
在英特尔汇编语言中,
MOV AH, something
表示将某些内容存储(或“移动”(w))到寄存器(w)AH
中。(Note动词“move”在历史上被使用过,但它是一个非常不幸的动词选择,因为当你移动某个东西时,它就不再存在于它的旧位置,而只能在它的新位置被找到,而在现实中,所有的“move”指令实际上都是复制数据:一旦指令完成,就可以在两个位置都找到值。令人惊讶的是,在一个需要如此多逻辑的学科中,人们在他们使用的语言中可以如此不合逻辑。)
4CH
是十六进制数4C
,以10为基数时为76
。后缀
H
向汇编程序表明它应该将数字解释为十六进制。通过要求所有数字(无论基数如何)都必须以十进制数字(0-9)开头,可以避免与寄存器名称(如AH
)(以及标签(如hash:
))混淆。AH
不以十进制数字开头,因此它不是一个数字。如果你想用十六进制来表示以10为基数的数字
10
,通常就是A
,但是在intel汇编中,你必须说0AH
。使用0
作为前缀并不会改变数字的值,但是它确保该数以十进制数字开始,因此它将被解释为数而不是寄存器X1 M13 N1 X的名称。这就是对“汇编语言中的
MOV AH, 4CH
是什么意思?”这个问题的答案。然而,OP可能并不想问这在汇编语言中是什么意思;操作员可能打算询问在MS-DOS中INT 21H
后面的MOV AH, 4CH
是什么意思。所以,它是这样的:
INT 21H
表示调用由十六进制数21
标识的中断(w)。MS-DOS(或者更像是现在的MS-DOS模拟程序)捕获对中断21 h的调用,并执行一些操作系统相关的功能,这些功能由寄存器
AH
的值标识。根据MS-DOS API (w),当
AH
= 4Ch时调用中断21 h会导致当前进程终止,并使用寄存器AL
的值作为进程的退出代码。64jmpszr2#
DOS中断int 21/4Ch是 EXIT - TERMINATE WITH RETURN CODE,
al
的内容被用作返回代码,进程被终止。文档附带以下注解:除非进程是它自己的父进程(参见#01378 [offset 16 h] at AH= 26 h),否则所有打开的文件都将关闭,所有属于进程的内存都将被释放。在调用此函数之前,所有网络文件锁都应被移除
u4vypkhs3#
MOV
代码的工作原理如下:MOV Value1,Value2
.它把
Value2
放入Value1
。但是你不能在内存中从一个变量移动到另一个变量。你可以像这样使用这段代码:你写的这段代码把十六进制的
4c
(=十进制的76)放入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
清除定义的区域并在其中写入属性。提示:视频内存被分成8页(0到7)。在这个例子中我们使用0页。
程序: