三、位操作指令
位操作指令包括位测试和位扫描指令,可以直接对一个二进制位进行测试,设置和扫描。
1 位测试和设置指令
格式:BT DEST,SRC
BTC DEST,SRC
BTR DEST,SRC
BTS DEST,SRC
功能:按照源操作指定的位号,测试目的操作数,当指令执行时,被测试位的状态被复制到进位标志CF。
BT将SRC指定的DEST中一位的数值复制到CF。BTC将SRC指定的DEST中一位的数值复制到CF,且将DEST中该位取反。BTR将SRC 指定的DEST中一位的数值复制到CF,且将DEST中该位复位。BTS将SRC指定的DEST中一位的数值复制到CF,且将DEST中该位置位。
目的操作数为16位或32位通用寄存器或存储器,源操作数为16位或32位通用寄存器,以及8位立即数,当源操作数为通用寄存器时,必须同目的操作数类型一致。源操作数SRC以两种方式给出目的操作数的位号,即
· SRC为8位立即数,以二进制形式直接给出要操作的位号;
· SRC为通用寄存器,如果DEST为通用寄存器,则SRC中二进制值直接给出要操作的位号。如果DEST为存储器操作数,通用寄存器SRC为带符号整数, SRC的值除以DEST的长度所得到的商作为DEST的相对偏移量,余数直接作为要操作的位号。DEST的有效地址为DEST给出的偏移地址和DEST相对偏移量之和。
BT,BTC,BTR,BTS指令影响CF标志位,其它标志位无定义。
例 3.53 MOV AX,1234H
MOV ECX,5
BT AX,CX ;CF=1AX=1234H
BTC AX,5 ;CF=1;AX=1214H
BTS AX,CX; ;CF=0AX=1234H
BTR EAX,ECX ;CF=1EAX=00001214H
例 3.54
·MODEL SMALL
·586
·DATA
DATA1 DW 1234H,5678H
·CODE
·START UP
BTC DATA1,3;CF=0(DATA1)=123CH
MOV CX,20
BTR DATA1,CX;CF=1[DATA+2]=5668H
·EXIT
END
2 位扫描指令
格式:BSFDEST,SRC
BSRDEST,SRC
功能:BSF从低位开始扫描源操作数,若所有位都是0,则ZF=0,否则ZF=1。并且将第一个出现1的位号存入目的操作数。BSR从高位开始扫描源操作数,若所有位都是0,则ZF=0,否则ZF=1。并且将第一个出现1的位号存入目的操作数。
源操作数可以为16位32位通用寄存器或存储器。目的操作数为16位或32位通用寄存器。源操作数和目的操作数类型必须一致。
BSF,BSR指令影响ZF标志位,其它标志位无定义。
例 3.55
MOV EBX,0F333EE00H
BSR EAX,EBX;ZF=1EAX=0000001FH=31
BSF EDX,EBX;ZF=1EDX=00000009H
3 进位标志指令
(1) 格式:CLC。功能:清除进位标志。
(2) 格式:STC。功能:设置进位标志。
(3) 格式:CMC。功能:进位标志取反。
4 条件设置字节指令
条件设置指令用于根据条件设置某一状态字节或标志字节,见表3 3。
格式:SETcondDEST
功能:测试条件(cond)若为真,则将目的操作数置01H,否则置00H。目的操作数允许为8位通用寄存器或8位存储器操作数。
条件cond与条件转移指令中的条件相同,共分三类。
(1) 以标志位状态为条件可以测试的标志位为ZF,SF,OF,CF,PF。
(2) 以两个无符号数比较为条件条件为高于、高于等于、低于、低于等于。
(3) 以两个带符号数比较为条件条件为大于、大于等于、小于、小于等于。
SET指令不影响标志位。
使用逻辑运算类指令应注意:
· 如果没有特别规定,参与运算的两个操作数类型必须一致,且只允许一个为存储器操作数;
· 如果参与运算的操作数只有一个,且为存储器操作数,必须使用PTR伪指令说明其数据类型;
· 操作数不允许为段寄存器;
· 目的操作数不允许为立即数;
· 如果是存储器寻址,则前面介绍的各种存储器寻址方式均可使用。
表 3.3 条件设置字节指令
3.3.4控制转移类指令
计算机执行程序一般是顺序地逐条执行指令。但经常须要根据不同条件做不同的处理,有时需要跳过几条指令,有时需要重复执行某段程序,或者转移到另一个程序段去执行。用于控制程序流程的指令包括转移、循环、过程调用和中断调用。
一、转移指令
1 无条件转移指令
格式:JMP TARGET
功能:使程序无条件地转移到指令规定的目的地址TARGET去执行指令。转移分为短转移、段内转移(近程转移)和段间转移(远程转移)。
(1) 段内直接转移:
格式:JMP SHORT TARGET;短转移
JMP NEAR PTR TARGET;近程转移
功能:采用相对寻址将当前IP值(即JMP指令下一条指令的地址)与JMP指令中给出的偏移量之和送IP中。段内短转移(SHORT)指令偏移量为8 位,允许转移偏移值的范围为-128~+127。段内近程转移(NEAR)指令在16位指令模式下,偏移量为16位,允许转移偏移值范围为-215~+ 215-1。在32位指令模式下,偏移值范围为-231~+231-1。
例 3.56
JMP NEXT
NEXT:MOV AL,BL
本例为无条件转移到本段内,标号为NEXT的地址去执行指令,汇编程序可以确定目的地址与JMP指令的距离。
(2) 段内间接转移:
格式:JMP REG
JMP NEAR PTR [REG]
功能:段内间接转移,其中JMP REG指令地址在通用寄存器中,将其内容直接送IP实现程序转移。JMP NEAR PTR [REG]指令地址在存储器中,默认段寄存器根据参与寻址的通用寄存器来确定,将指定存储单元的字取出直接送IP实现程序转移。在16位指令模式,转移偏移值范围为。在32位指令模式,转移偏移值范围为。
例 3.57 设DS=1000HEBX=00002000H。
JMP BX ;将2000H送IP
JMP NEAR PTR [BX] ;将地址1000∶2000单元存放的一个字送IP
JMP NEAR PTR [EBX] ;将段选择符为1000H,偏移地址为00002000H单元存放的双字送EIP。
(3) 段间直接转移:
格式:JMP FAR PTR TARGET
功能:段间直接转移,FAR PTR说明标号TARGET具有远程属性。将指令中由TARGET指定的段值送CS,偏移地址送IP。
例 3.58 JMP FAR PTR NEXT。
在16位指令模式下,段基地送CS,偏移地址为16位,转移偏移值范围;在32位指令模式下,代码段选择符送CS,偏移地址为32位,转移偏移值范围为。
(4) 段间间接转移:
格式:JMP FAR PTR [Reg]
功能:段间间接转移,由FAR PTR [Reg]指定的存储器操作数作为转移地址。
在16位指令模式下,存储器操作数为32位,包括16位段基址和16位偏移地址。
例 3.59
JMP FAR PTR [BX] ;数据段双字存储单元低字内容送IP
;数据段双字存储单元高字内容送CS
在32位指令模式下,存储器操作数包括16位选择符。
例 3.60 JMP FAR PTR [EAX]
指令中包含指向目标地址指针的门描述符或TSS描述符的指针,其所指的存储器操作数中仅选择符部分有效,指示调用门、任务门或TSS描述符起作用,而偏移部分不起作用。
2 条件转移指令
该类指令是根据上一条指令对标志寄存器中标志位的影响来决定程序执行的流程,若满足指令规定的条件,则程序转移;否则程序顺序执行。
条件转移指令的转移范围为段内短转移或段内近程转移,不允许段间转移。段内短转移(short)的转移偏移值范围为-128~+127。段内近程转移,在16位指令模式下转移偏移值范围为,在32位指令模式下转移偏移值范围为。
条件转移指令包括四类:单标志位条件转移;无符号数比较条件转移;带符号数比较条件转移;测试CX条件转移。
格式:Jcc TARGET
功能:若测试条件‘CC’为真,则转移到目标地址TARGET处执行程序。否则顺序执行。
(1) 单标志位条件转移指令,见表3 4。
例 3.61 JZ NEXT;若标志ZF=1则转移到标号NEXT处执行。
(2) 无符号数比较条件转移,见表3 5。
例 3.62 JA NEXT;无符号数A与B比较,若A>B则转移到标号NEXT处执行程序
表 3.4 单标志位条件转移指令
表 3.5 无符号数比较条件转移指令
表 3.6 带符号数比较条件转移指令
例 3.63 JG NEXT;带符号数A与B比较,若A>B则转移到标号NEXT。
(4) 测试CX条件转移,见表3 7。
表 3.7 测试CX条件转移指令
例 3.64 JCXZ TARGET;CX=0转移到标号TARGET处。
JECXZ TARGET;ECX=0转移到标号TARGET处。
条件转移指令一般紧跟在CMP或TEST指令之后,判断执行CMP或TEST指令对标志位的影响来决定是否转移。
例 3.65 符号函数
假设x为某值且存放在寄存器AL中,试编程将求出的函数值f(x)存放在AH中。
·MODEL TINY
·CODE
·STARTUP
CMPAL,0
JGE BIG
MOV AL,0FFH
JMP DONE
BIG: JE DONE
MOV AL,1
DONE:MOV AH,AL
·EXIT
END
例 3.66 编程实现把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。
·MODEL TINY
·CODE
·STARTUP
MOV CH,4
AGAIN: MOV CL,4
ROL BX,CL
MOV AL,BL
ANDAL,0FH
OR AL,30H
CMP AL,3AH
JB NEXT
ADD AL,07H
NEXT: MOV DL,AL;DL←要显示的ASCII码
MOV AH,2;显示
INT 21H
DECCH
JNZ AGAIN
·EXIT
END
二、循环控制指令
这类指令用(E)CX计数器中的内容控制循环次数,先将循环计数值存放在(E)CX中,每循环一次(E)CX内容减1,直到(E)CX为0时循环结束。
格式:LOOPcc TARGET
功能:将(E)CX内容减1,不影响标志位,若(E)CX不等于0,且测试条件‘CC’成立,则转移到目标地址TARGET处执行程序。转移范围为-128~+127。如表3 8所示。
表3.8 循环控制指令
例 3.67 计算
·MODEL TINY
·CODE
·STARTUP
XOR EAX,EAX
MOV EDX,1
MOV ECX,1000
SUM: ADD EAX,EDX
INC EDX
LOOPD SUM
·EXIT
END
例 3.68 找出以ARRAY为首地址的100个字数组中的第一个非0项,送AX寄存器中。
·MODELSMALL
·DATA
ARRAYDW 0,0,0,0,1010H,…;(100个字)
·CODE
·STARTUP
MOV CX,64H
LEA BX,ARRAY
MOV SI,0FFFEH
ZERO: INC SI
INC SI
CMP WORD PTR [BX+SI],0
LOOPZ ZERO
MOV AX,[BX+SI]
·EXIT
END
关于过程调用和返回指令将在子程序一节中介绍。
3.3.5串操作指令
80x86提供处理字符串的操作。串指连续存放在存储器中的一些数据字节、字或双字。串操作允许程序对连续存放大的数据块进行操作。
串操作通常以DS:(E)SI来寻址源串,以ES:(E)DI来寻址目的串,对于源串允许段超越。(E)SI或(E)DI这两个地址指针在每次串操作后,都自动进行修改,以指向串中下一个串元素。地址指针修改是增量还是减量由方向标志来规定。当DF=0,(E)SI及(E)DI的修改为增量;当DF= 1,(E)SI及(E)DI的修改为减量。根据串元素类型不同,地址指针增减量也不同,在串操作时,字节类型SI,DI加、减1;字类型SI,DI加、减 2;双字类型ESI,EDI加、减4。如果需要连续进行串操作,通常加重复前缀。重复前缀可以和任何串操作指令组合,形成复合指令,见表3 9。
一、重复前缀指令
表 3.9 重复前缀指令
二、方向标志指令
格式:CLD/STD
功能:CLD为清除方向标志,即将DF置‘0’。STD为设置方向标志,即将DF置‘1’。
三、串传送指令
基本格式:[REP]MOVS DESTS, SRCS
[REP] MOVSB/MOVSW/MOVSD
功能:将DS:(E)SI规定的源串元素复制到ES:(E)DI规定的目的串单元中,见表3 10。
表 3.10 MOVS指令
该指令对标志位无影响。
如果加重复前缀REP,则可以实现连续存放的数据块的传送,直到(E)CX=0为止。
在16位指令模式下,使用SI,DI,CX寄存器;在32位指令模式下,使用ESI,EDI,ECX寄存器。
例 3.69
·MODEL SMALL
·DATA
SRC DB 1,2,3,…(100个字节)
DEST DB 100DUP(?)
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,100
LEA SI,SRC
LEA DI,DEST
CLD
REP MOVSB
·EXIT
END
该程序将起始地址为SRC的100个字节内容传送到起始地址为DEST的存储单元。
四、串比较指令
基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
[REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
功能:由DS:(E)SI规定的源串元素减去ES:(E)DI指出的目的串元素,结果不回送,仅影响标志位CF,AF,PF,OF,ZF,SF。当源串元素与目的串元素值相同时,ZF=1;否则ZF=0。每执行一次串比较指令,根据DF的值和串元素数据类型自动修改(E)SI和(E)DI。
在串比较指令前加重复前缀REPE/Z,则表示重复比较两个字符串,若两个字符串的元素相同则比较到(E)CX=0为止,否则结束比较。在串比较指令 前加重复前缀REPNE/NZ,则表示若两个字符串元素不相同时,重复比较直到(E)CX=0为止,否则结束比较。
例 3.70 编程实现两个串元素比较,如相同则将全“1”送SUT单元,否则全“0”送SUT单元。
·MODEL SMALL
·DATA
DEST DB ‘A B C D E F G H’
SRC DB ‘A B C E F F F E’
SUT DB?
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,8
LEA SI,DEST
LEA DI,SRC
CLD
REPE CMPSB
JZ EQUL;ZF=1;CX=0
MOV BH,0;CX≠0,ZF=0
JMP DONE
EQUL: MOV BH,0FFH
DONE: MOV SUT,BH
·EXIT
END
五、串扫描指令
格式①: [REPE/Z] [REPNE/NZ] SCAS DESTS
格式②: [REPE/Z] [REPNE/NZ] SCASB/SCASW/SCASD
功能:由AL,AX或EAX的内容减去ES:(E)DI规定的目的串元素,结果不回送,仅影响标志位CF,AF,PF,SF,OF,ZF。当AL, AX或EAX的值与目的串元素值相同时,ZF=1;否则ZF=0。每执行一次串扫描指令,根据DF的值和串元素数据类型自动修改(E)DI。
在串扫描指令前加重复前缀REPE/Z,则表示目的串元素值和累加器值相同时重复扫描,直到CX/ECX=0为止,否则结束扫描。若加重复前缀 REPNE/NZ,则表示当目的串元素值与累加器值不相等时,重复扫描直到CX/ECX=0时为止,否则结束扫描。
该指令影响标志位为CF,AF,PF,SF,OF,ZF。
例 3.71 在内存DEST开始的6个单元寻找字符‘C’,如找到将字符‘C’的地址送ADDR单元,否则0送ADDR单元。
·MODEL SMALL
·DATA
DEST DB ‘A B C D E F’
ADDR DW?;存“C”的地址,所以设置为字类型
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,6
LEA DI,DEST
MOV AL,‘C’
CLD
REPNE SCASB
JZ EQUL
MOV DI,0
JMP DONE
EQUL: DEC DI
DONE: MOV ADDR,DI
·EXIT
END
六、 串装入指令
格式:LODS SRCS
LODSB/LODSW/LODSD
功能:将DS:SI/ESI所指的源串元素装入累加器(AL,AX,EAX)中,每装入一次都按照DF值以及串元素类型自动修改地址指针SI/ESI,该指令一般不须加重复前缀,并且不影响标志位。
七、 串存储指令
格式:[REP] STOS DESTS
[REP] STOSB/STOSW/STOSD
功能:将累加器\[AL,AX,EAX\]中值存入ES:DI/EDI所指的目的串存储单元中,每传递一次,都按DF值以及串元素类型自动修改地址指 针DI/EDI。若加重复前缀REP,则表示将累加器的值连续送目的串存储单元,直到CX/ECX=0时为止。
该指令不影响标志位。
3.3.6输入/输出指令
一、 输入指令
格式:IN DEST, SRC
功能:根据源操作数SRC给出的端口地址,将操作数从指定端口传送到目的操作数DEST处,其中DEST为AL,AX或EAX,端口地址SRC可以直接形式给出8位端口地址,或由DX寄存器以间接形式给出。
例 3.72
IN AL,10H
IN AX,20H
IN EAX,30H
IN AL,DX
IN AX,DX
IN EAX,DX
二、 输出指令
格式OUT DEST, SRC
功能:将源操作数SRC送到目的操作数DEST所指定的端口。其中源操作数SRC为AL,AX或EAX,目的操作数可以8位端口地址方式直接给出或以DX寄存器间接方式给出。
使用输入、输出指令应注意:
· 直接寻址方式端口地址为8位,共有0~255个端口地址;
· 间接寻址方式,只能用DX作为地址寄存器,寻址范围为64K字节;
· 每个I/O地址对应的端口的数据长度为8位,传送8位数据占用一个端口地址,传送16位数据占用2个端口地址,传送32位数据占用4个端口地址。
三、 串输入指令
格式:[REP] INS DESTS, DX
[REP] INSB/INSW/INSD
功能:根据DX给出的端口地址,从外设读入数据送入以ES:DI/EDI为地址的目的串存储单元中,每输入一次,均根据DF的值和串元素类型自动修改 DI/EDI的值。若加重复前缀REP,则表示连续从外设输入串元素存入目的串存储单元中,直到CX/ECX=0为止。
例 3.73 从端口地址为1000H处取数存入内存BLOCK单元。
·MODEL SMALL
·DATA
BLOCKDB?
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
CLD
LEA DI,BLOCK
MOV DX,1000H
INS BLOCK,DX
·EXIT
END
四、串输出指令
格式:[REP] OUTS DX,SRCS
[REP] OUTSB/OUTSW/OUTSD
功能:将DS:SI/ESI所指的源串元素,按照DX寄存器指定的端口地址送往外设,每输出一次,均根据DF的值和串元素类型自动修改SI/ESI的值,若加重复前缀REP,则表示连续向外设输出串元素,直到CX/ECX=0时为止。
例 3.74 将内存BLOCK为首地址的100个字符送往端口地址为2000H的外设。
·MODEL SMALL
·DATA
BLOCKDB ‘A,B,…’(100个字符)
·CODE
·STARTUP
CLD
LEA SI,BLOCK
MOV CX,100
MOV DX,2000H
REP OUTSB
·EXIT
END
在使用带重复前缀的串输入输出指令时,必须考虑端口的数据准备或接收状态。
所有输入输出指令均不影响标志位。
3.3.7处理器控制
一、 总线封锁前缀
格式:LOCK指令
功能:LOCK为指令前缀,可以使LOCK引脚变成逻辑0,在LOCK引脚有效期间,禁止外部总线上的其它处理器存取带有LOCK前缀指令的存储器操作数。
可加LOCK前缀的指令:
(1) ADD/SUB/ADC/SBB/OR/XOR/AND Mem, Reg/imm;
(2) NOT/NEG/INC/NEC Mem;
(3) XCHG Reg, Mem或XCHG Mem, Reg;
(4) BT/BTS/BRT/BTC Mem, Reg/imm。
Mem为存储器操作数,Reg为通用寄存器,imm为立即数。
二、空操作
格式:NOP
功能:空操作,除使IP/EIP增1外,不做任何工作。该指令不影响标志位。
三、处理器等待指令
格式:WAIT
功能:检查BUSY引脚状态,等待协处理器完成当前工作。
四、处理器暂停指令
格式:HLT
功能:暂停程序的执行。当产生一个外部中断或非屏蔽中断时,才继续执行下一条指令。
3.3.8中断指令与DOS功能调用
一、中断指令
在实模式下,中断矢量以4个字节存放在中断矢量表中,中断矢量表为1k字节(00000H~003FFH),中断矢量表允许存放256个中断矢量,每 个中断矢量包含一个中断服务程序地址(段值和16位偏移地址),中断矢量地址指针由中断类型码乘以4得到。
在保护模式下,用中断描述符表代替中断矢量表,每个中断由8个字节的中断描述符来说明,中断描述符表允许256个中断描述符,每个中断描述符包含一个中断服务地址(段选择符、32位偏移地址、访问权限等)。中断描述符地址指针由中断类型码乘以8得到。
中断指令格式:INT n
功能:产生中断类型码为n的软中断,该指令包含中断操作码和中断类型码两部分,中断类型码n为8位,取值范围为0~255(00H~FFH)。
软中断执行过程:
· 将标志寄存器FLAGS(或EFLAGS)压入堆栈;
· 清除TF和IF标志位;
· CS,IP/EIP压入堆栈;
· 实模式下,n×4获取中断矢量表地址指针;保护模式下,n×8获取中断描述符表地址指针;
· 根据地址指针,从中断矢量表或中断描述符表中取出中断服务程序地址送IP/EIP和CS中,控制程序转移去执行中断服务程序。
中断返回指令格式:IRET/IRETD
功能:该指令实现在中断服务程序结束后,返回到主程序中断断点处,继续执行主程序。
中断返回执行过程:
· IRET指令弹出堆栈中数据送IP,CS,FLAGS;
· IRETD指令弹出堆栈中数据送EIP,CS,EFLAGS。
其它中断类指令如表3 11所示。
表 3.11 中断类指令
二、DOS功能调用
系统功能调用是MS—DOS为程序员编写汇编语言源程序提供的一组子程序,包括设备管理、文件管理和目录管理等。
DOS规定使用软中断指令INT 21H作为进入各功能子程序的总入口,再为每个功能调用规定一个功能号,引用功能号即可进入相应的子程序入口。DOS系统功能调用的使用方法归纳如下:
(1) 传送入口参数到指定的寄存器中;
(2) 把要调用功能的功能号送入AH寄存器中;
(3) 用INT 21H指令转入子程序入口;
(4) 相应的子程序运行结束后,可以按照规定取得出口参数。
常用系统功能调用简介。
1 键盘输入单字符
这是1号系统功能调用,其调用格式为
MOV AH,1
INT 21H
该功能调用无入口参数。其功能为系统等待键盘输入,如是Ctrol-Break键则退出;否则将键入字符的ASCII码送入AL寄存器中,并且通过显示器显示该字符。
2 键盘输入字符串
这是0AH号系统功能调用,其功能为将键盘输入的字符串写入内存单元中。因此,首先在内存中定义一个缓冲区,缓冲区第一个字节存放规定字符串的最大字节数,第二个字节由系统送入实际键入的字符数,从第三个字节开始用于存放键入的字符串,最后通过键入回车键来表示字符串的结束。如果实际键入的字符数未达到最大规定数,其缓冲区的空余区间填0;如果实际键入数超过缓冲区的容量,则超出的字符自动丢失,而且响铃警告。注意,回车键值也存于缓冲区中。
例 3.75 使用格式举例。
·MODEL SMALL
·DATA
BUF DB 20
DB?
DB 20 DUP(?)
·CODE
·STARTUP
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
·EXIT
END
该程序在BUF为首地址的缓冲区定义了20个字符串字节的缓冲区,并且将缓冲区首地址送入DX中,调用0AH号子程序,系统等待用户键入字符串,每键入一个字符,其相应的ASCII码将被写入缓冲区中,直到键入回车键,由系统输入实际键入字符数,送入缓冲区第二个字节中。
3 输出单字符
这是2号系统功能调用,其使用格式为:
MOV DL,‘A’
MOV AH,2
INT 21H
执行2号系统功能调用,将置入DL寄存器中的字符(以ASCII码形式表示)通过显示器显示出来(或从打印机输出)。
4 输出字符串
这是9号系统功能调用,其功能是将指定的内存缓冲区中的字符串从显示器显示输出(或从打印机输出),缓冲区中的字符串以字符‘$’作为结束标志。
例 3.76使用格式举例。
·MODEL SMALL
·DATA
BUF DB ‘Thank you $’
·CODE
·STARTUP
MOV DX,OFFSET BUF
MOV AH,9
INT 21H
·EXIT
END
5 返回操作系统
这是4CH号系统功能调用,使用格式为
MOV AH,4CH
INT 21H
在用户程序结束处插入此调用,则返回到DOS操作系统,显示器显示系统提示符。