实验三:INT21功能的使用
一. 实验目的
1. 了解INT 21H 各功能块的功能和使用方法
2. 掌握字符方式下PC机显示器显示控制
二. 实验设备
PC机一台
三. 实验内容及步骤
本实验在显示器上显示A~Z 26个英文字母。显示器I/O功能调用使用说明如下:INT 21H使用说明
(1)入口:AH=01H
功能:键盘输入字符,AL=输入字符
(2)入口:AH=02H,DL=数据(ASCII码)
功能:写DL中的数据到屏幕上
(3)入口:AH=09H,DS:DX=字串首址,且字符串尾用$ 填充
功能:显示一字串,直到遇到$ 为止。
四. 编程练习
A).利用INT 21H功能,在PC机上显示:“MY NAME IS ……………”.
B).编程计算Z=5678H+6666H-1234H,并把结果显示在屏幕上。
C).编程计算Z=5678H+0666H÷14H,并把结果显示在屏幕上.
D).编程计算Z=5678H+0321H×02H,并把结果显示在屏幕上。
E).编程计算Z=5678H-6666H+8888H,并把结果显示在屏幕上。
F).编程计算Z=5678H+0666H-ABCDH,并把结果显示在屏幕上。
G).编程计算Z=0678H÷06H×14H,并把结果显示在屏幕上。
五.软件流程图和程序清单
A);利用INT 21H功能,在PC机上显示:“MY NAME IS ……………”
DATAS SEGMENT
STRING DB 'MY NAME IS ZHANGSHAOJUN!','$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,STRING ;获取要显示字符串首地址
MOV AH,09H ;显示字符
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
【运行结果】
B);编程计算 Z=5678H+6666H-1234H,并把结果显示在屏幕上。
查表法:
DATAS SEGMENT
ORG 0300H
TAB DB "0","1","2","3","4","5","6","7","8",
"9","A","B","C","D","E","F"
NUM DW 5678H,6666H,1234H
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA SI,NUM
MOV AX,[SI]
ADC AX,[SI+2]
SUB AX,[SI+4]
MOV CX,04H ;将AX中的十六进制数显示在屏幕上
BBB:MOV BX,0010H
MOV DX,0
DIV BX ;依次求出AX中数的低位到高位,于DX中
PUSH AX
MOV DI,DX
MOV BYTE PTR DL,0300H[DI] ;查表找出对于ASCII码值,存入DL中,显示 MOV AH,02H
INT 21H
POP AX
LOOP BBB
MOV DL,'H' ;显示?H?
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
【运行结果】
求值法:
CODES SEGMENT
ASSUME CS:CODES
START:
MOV AX,5678H+6666H-1234H
MOV CX,4
ROL AX,CL
CCC:PUSH AX
AND AX,000FH
CMP AX,09H
JC BBB ;CF=1,跳转
ADD AX,07H ;CF=0,AX中值加07H
BBB:ADD AX,30H ;AX中数值加30H,得到对于ASCII值
MOV DX,AX
MOV AH,02H ;显示一位
INT 21H
POP AX
PUSH CX
MOV CL,4
ROL AX,CL ;右移4位,将所要显示数字置于AX最低位
POP CX
LOOP CCC
MOV DL,'H' ;显示?H?
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
【运行结果】
F);F编程计算 Z=5678H+0666H-ABCDH,并把结果显示在屏幕上。
DATAS SEGMENT
ORG 3700H
TAB DB "0","1","2","3","4","5","6","7","8",
"9","A","B","C","D","E","F"
NUM DW 5678H,0666H,0ABCDH
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA SI,NUM
MOV AX,[SI]
ADD AX,[SI+2]
SUB AX,[SI+4]
PUSH AX
JNB CCC ;CF位为0,则转移
MOV DL,'-' ;CF位为1,则显示?-…号,并将AX中的负数,加1取反,求原码 MOV AH,02H
INT 21H
PUSH AX
DEC AX
NOT AX
CCC:MOV CX,04H ;将AX中的十六进制数显示在屏幕上
BBB:MOV BX,0010H
MOV DX,0
DIV BX
PUSH AX
MOV DI,DX ;依次求出AX中数的低位到高位,于DX中
MOV BYTE PTR DL,3700H[DI] ;查表找出对于ASCII码值,存入DL中,显示 MOV AH,02H
INT 21H
PUSH AX
LOOP BBB
MOV DL,'H' ;显示?H?
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
【运行结果】
六.实验心得:
这次实验主要是了解INT 21H 各功能块的功能和使用方法,编程后6题基本上是相似的,所以选择了几个写在报告纸上,在这次实验里面,我感觉自己用到了很多寄存器,思路也特别混乱,希望在以后不断学习中,能写出更合理更简单
的程序。