昆
明理工大学
微机原理及程序设计
实验指导书
段绍米 编
昆明理工大学信息工程与自动化学院
自动化系 2013年10月
0
微机原理实验实验要求及运行环境
1、 实验要求与注意事项:
交纸质版实验报告,实验要求: 实验成绩百分制( 总分100分) 实验过程(50分) 实验报告(50分) 提前预习,写好实验报告,标好注释,修改好程序; 个人按要求独立完成,填好实验结果,对实验程序进行讲解,按时交实验报告 不做与本实验无关的事(如玩游戏、聊天、打电话、听音乐等) 不得缺席,实验签名(两份),按要求填写设备号实验名称等,不带他人签名 带走自己的垃圾,保持实验室卫生,电脑设备桌椅摆设整齐,保管好个人物品 按秩序进出实验室,不拥挤,注意安全,爱护设备,保证设备完好 报告纸要统一,全部手写并填写好表头,包括:实验名称、姓名、学号、班级任课老师等 实验目的、实验内容 程序框图 程序清单 读懂程序加注释(每句注释13+分段注释7) 实验结果,实验中经老师检查过 程序修改,实验要求的完成及结果(可用蓝/黑在原程序上标明,并加注释)
交电子版实验报告,实验要求: 实验成绩百分制( 总分100分) 实验过程(50分) 实验报告(50分) 提前预习,标好程序注释,修改好程序; 个人按要求独立完成,填好实验结果,对实验程序进行讲解,按时交实验报告 不做与本实验无关的事(如玩游戏、聊天、打电话、听音乐等) 不得缺席,实验签名(两份),按要求填写设备号实验名称等,不带他人签名 带走自己的垃圾,保持实验室卫生,电脑设备桌椅摆设整齐,保管好个人物品 按秩序进出实验室,不拥挤,注意安全,爱护设备,保证设备完好 报告按统一格式要求填写,包括:课程名称、姓名、学号、班级任课老师等 实验报告包括实验目的、实验内容、程序框图、程序清单、实验要求 读懂程序加注释(每句注释13+分段注释7) 实验结果,实验中经老师检查过 程序修改,实验要求的完成及结果(可用其他颜色标明添加的程序,与原程序不同,并加注释) 10分 20分 5分 5分 5分 5分 10分 5分 20分 5分 10分 10分 20分 5分 5分 5分 5分 2分 3分 5分 5分 20分 5分 10分
2、实验运行环境
在电脑中装ASM Masm for windows 集成实验环境2008。双击图标
打开ASM MasM
for windows 集成实验环境运行工作界面,输入实验程序代码,调试、改错、保存、运行、查看结果,进行记录。
运行结果显示:
1
实验一 两个多位十进制数相加的实验
一、 实验目的
1、学习数据传送和算术运算指令的用法。
2、熟悉在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程。
二、 实验内容
将两个多位十进制数相加。要求被加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
三、 程序框图
显示被加数和加数
被加数和加数以ASCII码表示的数字串形 式转化为由十六进制表示的数字串形式 计数值5→CX 清除最低位进位 执行ADC带进位相加 AAA调整 结果送被加数区 2
调整偏移量 N CX-1=0? Y 十六进制的结果转化为ASCII码表示的数字串 显示结果 结束
四、 程序清单
CRLF MACRO ;宏定义,宏名:CRLF
MOV DL, 0DH ;把0DH给DL
MOV AH, 02H ; 把02H给AH
INT 21H ;系统功能调用——实现回车功能 MOV DL, 0AH ;把0AH给DL MOV AH, 02H ; 把02H给AH
INT 21H ;系统功能调用——实现换行功能 ENDM ;宏定义结束——本段实现回车换行功能 DATA SEGMENT;数据段定义,段名DATA
DATA1 DB 33H, 39H, 31H, 37H, 34H; 变量DATA1中装入加数 DATA2 DB 36H, 35H, 30H, 38H, 32H; 变量DATA2中装入被加数 DATA ENDS;数据段定义结束——本段实现了两个数据的定义 STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA START: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX
MOV SI, OFFSET DATA2 MOV BX, 05 CALL DISPL
3
CRLF
MOV SI, OFFSET DATA1 MOV BX, 05 CALL DISPL CRLF
MOV DI, OFFSET DATA2 CALL ADDA
MOV SI, OFFSET DATA1 MOV BX, 05 CALL DISPL CRLF
MOV AX, 4C00H INT 21H DISPL PROC NEAR DS1: MOV AH, 02
MOV DL, [SI+BX-1]
INT 21H DEC BX JNZ DS1 RET DISPL ENDP
ADDA PROC NEAR MOV DX, SI MOV BP, DI MOV BX, 05
AD1: SUB BYTE PTR [SI+BX-1] , 30H SUB BYTE PTR [DI+BX-1] , 30H DEC BX JNZ AD1 MOV SI, DX MOV DI, BP MOV CX, 05 CLC
AD2: MOV AL, [SI] MOV BL, [DI] ADC AL, BL AAA
MOV [SI] , AL INC SI INC DI LOOP AD2 MOV SI, DX MOV DI, BP
4
MOV BX, 05
AD3: ADD BYTE PTR [SI+BX-1], 30H ADD BYTE PTR [DI+BX-1], 30H DEC BX JNZ AD3 RET ADDA ENDP CODE ENDS END START
五、 实验要求
1. 2.
读懂源程序,写出源程序注释。
把源程序修改为任意两个六位十进制相加。并思考如果最高位有进位怎么办?
修改后程序清单: CRLF MACRO
MOV DL,0DH MOV AH,02H INT 21H
MOV DL,0AH MOV AH,02H INT 21H ENDM
DATA SEGMENT DATA1 DB 6 DUP(?) DATA2 DB 6 DUP(?) DATA3 DB ? DATA ENDS
STACK SEGMENT
STA DB 20 DUP(?)
TOP EQU LENGTH STA STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
MOV SI,OFFSET DATA2 CALL ADDB CRLF
MOV SI,OFFSET DATA1 CALL ADDB
5
CRLF
MOV DI,OFFSET DATA2 CALL ADDA
MOV AH,DATA3 SAHF
MOV DL,30H ADC DL,0 CMP DL,30H JZ JIEGUO MOV AH,02H INT 21H
JIEGUO:MOV SI,OFFSET DATA1 MOV BX,06 CALL DISPL CRLF
MOV AX,4C00H INT 21H DISPL PROC NEAR DS1: MOV AH,02
MOV DL,[SI+BX-1] INT 21H DEC BX JNZ DS1 RET DISPL ENDP
ADDA PROC NEAR MOV DX,SI MOV BP,DI MOV BX,06
AD1: SUB BYTE PTR [SI+BX-1],30H SUB BYTE PTR [DI+BX-1],30H DEC BX JNZ AD1 MOV SI,DX MOV DI,BP MOV CX,06 CLC
AD2: MOV AL,[SI] MOV BL,[DI] ADC AL,BL AAA
MOV [SI],AL INC SI INC DI
6
LOOP AD2 LAHF
MOV DATA3,AH MOV SI,DX MOV DI,BP MOV BX,06
AD3: ADD BYTE PTR [SI+BX-1],30H ADD BYTE PTR [DI+BX-1],30H DEC BX JNZ AD3 RET ADDA ENDP
ADDB PROC NEAR MOV BX,6
SH1: MOV AH,01H INT 21H
MOV [SI+BX-1],AL DEC BX CMP BX,0 JNZ SH1 RET ADDB ENDP CODE ENDS END START
实验二 两个数相乘的实验
一、 实验目的
掌握乘法指令和循环指令的用法。
二、 实验内容
实现十进制数的乘法。被乘数和乘数均以ASCII码形式存放在内存中,乘积在屏幕上显示出来。
三、 程序框图
乘数→BL
BL中数由ASCII码转化为十六进制
SI指向被乘数
计数值5→CX 7
取被乘数[SI]单元与BL相乘 AAM调整 结果低位与前次计算的进位[DI]相加 AAA调整 结果→[DI] DI+1指向下一单元 本次计算的进位→[DI] N CX-1=0? Y 显示结果 结束
四、 程序清单
DATA DATA1 DATA2 RESULT DATA STACK STA TOP STACK
CODE ASSUME START:
SEGMENT
DB 32H,39H,30H,35H,34H DB 33H DB 6 DUP(00H) ENDS
SEGMENT DB 20 DUP(?) EQU LENGTH STA ENDS
SEGMENT CS:CODE,DS:DATA,SS:STACK,ES:DATA MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP
8
LOOP1: DISPL: CODE END MOV MOV MOV AND MOV MOV MOV MOV AND INC MUL AAM ADD AAA MOV INC MOV LOOP MOV MOV MOV MOV ADD INT DEC LOOP MOV INT ENDS START
SP,AX
SI,OFFSET DATA2 BL,[SI]
BL,00001111B
SI,OFFSET DATA1 DI,OFFSET RESULT CX,05 AL,[SI]
AL,00001111B SI BL
AL,[DI]
[DI],AL DI
[DI],AH LOOP1 CX,06
SI,OFFSET RESULT AH,02 DL,[SI+5] DL,30H 21H SI DISPL AX,4C00H 21H
五、 实验要求
1.读懂程序,写出程序注释。
2.修改程序,实现6位数乘2位数的功能。
修改后程序清单: CRLF MACRO MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H ENDM
9
DATA SEGMENT DATA1 DB 6 DUP (?) DATA2 DB ? DATA3 DB 8 DUP(?) DATA4 DB ? DATA5 DB 8 DUP(?) DATA ENDS
STACK SEGMENT
STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE , DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP
MOV SP,AX ;系统的初始化
MOV SI,OFFSET DATA1+5 MOV CX,06 SHURU: MOV AH,1 INT 21H MOV [SI],AL DEC SI
LOOP SHURU ;循环,输入6位数 CRLF MOV AH,1 INT 21H
MOV SI,OFFSET DATA2
MOV [SI],AL ;键入一个字符,存入DATA2 MOV AH,1 INT 21H
MOV SI,OFFSET DATA4
MOV [SI],AL;键入一个字符,存入DATA4 CRLF
10
MOV SI,OFFSET DATA2;data2中的数据乘BL,结果放DATA3中 MOV BL,[SI] AND BL,00001111B MOV SI,OFFSET DATA1
MOV DI,OFFSET DATA3+1;位与六位数的积 MOV CX,06 LOOP1: MOV AL,[SI] AND AL,00001111B INC SI MUL BL
AAM ;把AH中的积调整到非压缩的BCD格式 ADD AL,[DI]
AAA ;把AL中的和调整到非压缩的BCD格式,AH=AH+调整产生的进位 MOV [DI],AL INC DI MOV [DI],AH LOOP LOOP1
MOV SI,OFFSET DATA4 ;DATA4中的数据乘BL,结果放DATA5中 MOV BL,[SI] AND BL,00001111B MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA5 MOV CX,06 LOOP2: MOV AL,[SI] AND AL,00001111B INC SI
MUL BL; AX=BL*AL
AAM ;把AH中的积调整到非压缩的BCD格式 ADD AL,[DI]
AAA ;把AL中的和调整到非压缩的BCD格式,AH=AH+调整产生的进位 MOV [DI],AL INC DI MOV [DI],AH LOOP LOOP2
MOV SI,OFFSET DATA3 ;DATA3中的数据与DATA5中的数据相加
11
MOV DI,OFFSET DATA5 CALL ADDA MOV BX,08
CALL DISPL;显示结果 CRLF
MOV AX,4C00H INT 21H DISPL PROC NEAR DSI: MOV AH,02 MOV DL,[SI+BX-1] INT 21H DEC BX JNZ DSI RET DISPL ENDP
ADDA PROC NEAR MOV DX,SI MOV BP,DI
MOV CX,08 AD2: MOV AL,[SI] MOV BL,[DI] ADC AL,BL AAA MOV [SI],AL INC SI INC DI LOOP AD2 MOV SI,DX MOV DI,BP MOV BX,8
AD3: ADD BYTE PTR[SI+BX-1],30H ADD BYTE PTR[DI+BX-1],30H DEC BX JNZ AD3 RET
12
ADDA ENDP CODE ENDS END START
实验三 BCD码相乘的实验
一、实验目的
掌握用组合的BCD码表示数据,并熟悉怎样实现组合BCD码乘法运算。
二、实验内容
实现BCD码的乘法,要求被乘数和乘数均以组合的BCD码形式存放,各占一个内存由于没有组合BCD码乘法指令,所以程序中采用将乘数1作为计数器,累加另一个乘单元,乘积存放在另外两个内存单元中。 数的方法得到计算结果。
三、程序框图
显示乘数1和乘数2 乘数1→计数器BL中 部分积DX清0 Y BL=0? N 进位位清0 显示结果 乘数2与部分积低位相加 结束 DAA调整 结果→DL 部分积高位进行进位位调整 DAA调整 结果→DH 计数器BL的值减1 13
DAS调整,并将结果送BL 四、程序清单
DISPL MACRO
ADD DL,30H MOV AH,02 ENDM CRLF ENDM DATA DATA1 DATA2 RESULT DATA STACK STA TOP STACK CODE ASSUME START: INT 21H MACRO
MOV DL,0DH MOV AH,02 INT 21H MOV DL,0AH MOV AH,02 INT 21H SEGMENT
DB 01001000B DB 01110101B DW ? ENDS
SEGMENT STACK DB 20 DUP(?) EQU LENGTH STA ENDS SEGMENT
CS:CODE,DS:DATA,SS:STACK,ES:DATA MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
MOV DI,OFFSET RESULT MOV SI,OFFSET DATA1 MOV AH,[SI] MOV CL,04 SHR AH,CL MOV DL,AH DISPL
14
MOV AL,[SI] MOV BL,AL AND AL,00001111B MOV DL,AL DISPL CRLF
MOV SI,OFFSET DATA2 MOV AH,[SI] MOV CL,04 SHR MOV DISPL
MOV AND MOV DISPL CRLF
XOR S1: CMP JZ CLC
MOV ADC DAA
MOV MOV ADC DAA
MOV MOV DEC DAS
MOV JMP S2: MOV MOV MOV SHR MOV DISPL
MOV AND MOV AH,CL DL,AH AL,[SI] AL,00001111B DL,AL DX,DX BL,0 S2 AL,[SI] AL,DL DL,AL AL,00H AL,DH DH,AL AL,BL AL BL,AL S1
[RESULT],DX SI,DX CL,4 DH,CL DL,DH DX,SI DH,00001111B DL,DH
15
DISPL
MOV DX,SI MOV CL,4 SHR DL,CL DISPL
MOV DX,SI AND DL,00001111B DISPL CRLF
S3: MOV AX,4C00H INT 21H CODE ENDS END START
五、实验要求
1.读懂源程序,写出程序注释。
2.修改程序使其不显示被乘数和乘数。 修改后程序清单:
DISPL MACRO ;宏定义
ADD DL,30H ;将数字变成ASCII码 MOV AH,02 INT 21H
ENDM ;宏作用:显示数字 CRLF MACRO ;宏定义 MOV DL,0DH MOV AH,02 INT 21H MOV DL,0AH MOV AH,02 INT 21H
ENDM ;宏作用:回车换行 DATA SEGMENT ;数据段定义
DATA1 DB 01001000B DATA2 DB 01110101B RESULT DW ? DATA ENDS
STACK SEGMENT STACK ;堆栈段定义 STA DB 20 DUP(?)
TOP EQU LENGTH STA ;TOP=20 STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX
16
MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
MOV DI,OFFSET RESULT ;取偏移地址 MOV SI,OFFSET DATA1
MOV AH,[SI] ;将数据1送到AH MOV CL,04
SHR AH,CL ;逻辑右移04次 MOV DL,AH
;DISPL ;显示高位数字
MOV AL,[SI] ;将数据1低四位送到AL MOV BL,AL
AND AL,00001111B ;将高四位清零 MOV DL,AL
;DISPL ;显示低位数字 CRLF ;回车换行
MOV SI,OFFSET DATA2 MOV AH,[SI] MOV CL,04 SHR AH,CL MOV DL,AH ;DISPL
MOV AL,[SI] AND AL,00001111B MOV DL,AL ;DISPL
CRLF ;显示数据2
XOR DX,DX ;DX清零 S1: CMP BL,0
JZ S2 ;BL为零,跳转s2,显示结果 CLC ;进位清零 MOV AL,[SI]
ADC AL,DL ;乘数2与部分积低位相加 DAA
MOV DL,AL ;结果送回DL MOV AL,00H
ADC AL,DH ;部分积高位进行调整 DAA
MOV DH,AL MOV AL,BL
DEC AL ;计数BL-1 DAS
MOV BL,AL
17
JMP S1
S2: MOV [RESULT],DX ;DX送入储存器 MOV SI,DX MOV CL,4 SHR DH,CL MOV DL,DH DISPL
MOV DX,SI
AND DH,00001111B MOV DL,DH DISPL
MOV DX,SI MOV CL,4 SHR DL,CL DISPL
MOV DX,SI
AND DL,00001111B
DISPL ;连及以上为显示结果算法 CRLF
S3: MOV AX,4C00H
INT 21H ;非标准方式 CODE ENDS END START
实验四 字符匹配程序
一、实验目的
掌握提示信息的使用方法及键盘输入信息的用法。
二、实验内容
编写程序,实现两个字符串比较。如果两个字符串中有一个字符相同,显示“MATCH”,否则,显示“NO MATCH”。
三、程序框图
段寄存器及堆栈初始化 显示“请输入字符串1” 使用INT 21H的0A号子功能, 接收键入的字符串 18
显示“请输入字符串2” 指针SI指向串1的首字符
SI指向的字符串和串2中所有字符作比较 Y 相等?
N SI+1,指向串1中下一字符
N 串1中的字符已取完?
Y 显示“NO MATCH” 显示“MATCH”
返回DOS
四、程序清单
CRLF MACRO MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDM DATA SEGMENT
MESS1 DB 'MATCH',0DH,0AH,'$' MESS2 DB 'NO MATCH',0DH,0AH,'$' MESS3 DB 'INPUT STRING1:',0DH,0AH,'$' MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' MAXLEN1 DB 81 ACTLEN1 DB ? STRING1 DB 81 DUP (?) MAXLEN2 DB 81
19
ACTLEN2 DB ?
STRING2 DB 81 DUP (?) DATA ENDS
STACK SEGMENT STACK STA DB 50 DUP (?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AH,09H
MOV DX,OFFSET MESS3 INT 21H MOV AH,0AH
MOV DX,OFFSET MAXLEN1 INT 21H CRLF
MOV AH,09H
MOV DX,OFFSET MESS4 INT 21H MOV AH,0AH
MOV DX,OFFSET MAXLEN2 INT 21H CRLF CLD
MOV SI,OFFSET STRING1 MOV CL,[SI-1] MOV CH,00H
KKK: MOV DI,OFFSET STRING2 PUSH CX MOV CL,[DI-1] MOV CH,00H MOV AL,[SI] MOV DX,DI REPNZ SCASB JZ GGG INC SI POP CX
20
LOOP KKK MOV AH,09H
MOV DX,OFFSET MESS2 INT 21H JMP PPP
GGG: MOV AH,09H MOV DX,OFFSET MESS1 INT 21H
PPP: MOV AX,4C00H INT 21H CODE ENDS END START
五、实验要求
1.读懂源程序,写出程序注释。
2.修改源程序,使其实现,当两个字符串中所有字符都匹配(注意字符串的长度和顺
序)时才显示“MATCH”,否则显示“NO MATCH”。
修改后程序清单: CRLF MACRO MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDM DATA SEGMENT
MESS1 DB 'MATCH',0DH,0AH,'$' MESS2 DB 'NO MATCH',0DH,0AH,'$' MESS3 DB 'INPUT STRING1:',0DH,0AH,'$' MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' MAXLEN1 DB 81 ACTLEN1 DB ? STRING1 DB 81 DUP (?) MAXLEN2 DB 81 ACTLEN2 DB ?
STRING2 DB 81 DUP (?) DATA ENDS
STACK SEGMENT STACK
21
STA DB 50 DUP (?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AH,09H
MOV DX,OFFSET MESS3 INT 21H;显示 INPUT STRING1: MOV AH,0AH
MOV DX,OFFSET MAXLEN1 INT 21H ;输入字符串1 CRLF
MOV AH,09H
MOV DX,OFFSET MESS4 INT 21H
MOV AH,0AH ;显示 INPUT STRING2: MOV DX,OFFSET MAXLEN2 INT 21H;输入字符串2 CRLF
CLD;方向标志位清零
MOV SI,OFFSET STRING1 MOV CL,[SI-1] MOV CH,00H MOV DL,CL
MOV DI,OFFSET STRING2 MOV CL,[DI-1] MOV CH,00H CMP CL,DL
JNZ GGG;判断长度是否相等 KKK: MOV AL,[SI] MOV DL,[DI] CMP AL,DL
22
JNZ GGG ;判断字符是否相等 INC SI INC DI
LOOP KKK MOV AH,09H
MOV DX,OFFSET MESS1 INT 21H ;显示 NO MATCH JMP PPP
GGG: MOV AH,09H MOV DX,OFFSET MESS2 INT 21H;显示 MATCH PPP: MOV AX,4C00H INT 21H CODE ENDS END START
实验五 排序实验
一、实验目的
掌握用汇编语言编写排序程序的思路和方法。
二、实验内容
从首地址为1000H开始存放50个数,要求设计程序将这些数由小到大排序,排序后的数,仍放在该区域中。
三、程序框图
入口 段寄存器和堆栈初始化 显示“请输入段址”
调GETNUM,键入段址送ES
显示“请输入偏移量”
调GETNUM,键入偏移量SI
DS也指向附加段
外循环次数SORTNUM-1送CX
23
偏移指针BX清0 A 从[SI+BX]单元取数AL
交换单元指针AH=BL
CX入栈 计算内循环次数送CX
内循环控制变量DX初始化 DX值+1 比较AL与DX指示单元的值
N AL较大?
Y DX指示单元的值赋给AL,并修改指针AH
N CX-1=0?
Y 交换[SI+BX]单元和AH指针指示的单元的值
偏移指针BX+1 CX 出栈 N A CX-1=0? Y 显示“SORT OK!”
24
循环调DISP1,将排序后的数依次显示出来
返回DOS
四、程序清单
CRLF MACRO MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDM
DATA SEGMENT ORG 160H
DATA1 DB 0ah,09h,08h,07h,06h,05h,04h,03h,02h,01h SORTNUM EQU 10
MESS1 DB 'INPUT SEGMENT VALUE:$' MESS2 DB 'INPUT OFFSET VALUE:$' MESS3 DB 'SORT OK!',0DH,0AH,'$' ERROR DB 'INPUT ERROR!',0DH,0AH,'$' DATA ENDS STACK SEGMENT
STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SP,TOP MOV AH,09H
MOV DX,OFFSET MESS1 INT 21H CALL GETNUM MOV ES,DX CRLF
MOV AH,09H
MOV DX,OFFSET MESS2 INT 21H
25
CALL GETNUM MOV SI,DX PUSH ES
POP DS; DS= ES MOV CX,SORTNUM DEC CX XOR BX,BX III: MOV AL,[SI+BX] MOV AH,BL PUSH MOV SUB DEC MOV JJJ: INC PUSH MOV CMP JBE MOV MOV UUU: POP LOOP MOV MOV MOV PUSH MOV MOV POP INC POP LOOP PUSH MOV MOV MOV MOV INT POP MOV VVV: MOV CALL CX
CX,SORTNUM CX,BX CX DX,BX DX BX BX,DX AL,[SI+BX] UUU
AL,[SI+BX] AH,DL BX JJJ
CL,[SI+BX] [SI+BX],AL DL,AH BX BX,DX [SI+BX],CL BX BX CX III DS AX,DATA DS,AX AH,09H
DX,OFFSET MESS3 21H DS
CX,SORTNUM AL,[SI] DISP1
26
CRLF
INC SI LOOP VVV MOV AX,4C00H INT 21H DISP1 PROC NEAR PUSH CX MOV BL,AL MOV DL,BL MOV ROL AND CALL MOV AND CALL POP RET DISP1 ENDP
DISPL PROC ADD CMP JB ADD DDD: MOV INT RET DISPL ENDP
GETNUM PROC PUSH XOR GGG: MOV INT CMP JZ CMP JZ SUB JB CMP JB CMP JB CL,04 DL,CL DL,0FH DISPL DL,BL DL,0FH DISPL CX NEAR DL,30H DL,3AH DDD DL,27H AH,02H 21H NEAR CX DX,DX AH,01H 21H AL,0DH PPP AL,20H PPP AL,30H KKK AL,0AH GETS AL,11H KKK
27
SUB AL,07H CMP AL,0FH JBE GETS CMP AL,2AH JB KKK CMP AL,2FH JA KKK SUB AL,20H GETS: MOV CL,04 SHL DX,CL XOR AH,AH ADD DX,AX JMP GGG KKK: MOV AH,09H
MOV DX,OFFSET ERROR INT 21H PPP: PUSH DX CRLF
POP DX POP CX RET GETNUM ENDP CODE ENDS END START
五、 实验要求
1.读懂程序,写出程序注释。
2. 修改程序,使其实现从大到小的排序
28
实验六 接收年、月、日信息显示的程序
一、实验目的
掌握响铃符方法,并且掌握年、月、日的输入方法。
二、实验内容
先显示“WHAT IS THE DATA (MM/DD/YY)?”并响铃一次,然后接收键盘输入的月/日/年信息,并显示。
三、程序框图
入口 段寄存器和堆栈初始化 显示“WHAT IS THE DATA”
输出响铃字符 调GETNUM,接收键入的月值,日值及年值
调DISP显示年值 输出字符“—” 调DISP显示月值
输出字符“—” 29
调DISP显示日值
返回DOS 四、程序清单
CRLF
MACRO MOV MOV INT MOV MOV INT
21H 21H
AH,02H DL,0AH AH,02H DL,0DH
ENDM DATA MESS DATA STA TOP CODE
SEGMENT DB DB ENDS SEGMENT
32 DUP(?) ?
' WHAT IS THE DATA(MM/DD/YY)?',0DH,0AH,'$' 'INPUT ERROR!',0DH,0AH,'$'
ERROR STACK
DW DW
STACK ASSUME START:
ENDS SEGMENT
CS:CODE,DS:DATA,ES:DATA,SS:STACK MOV MOV MOV MOV MOV MOV INT MOV MOV INT CALL PUSH CALL PUSH CALL MOV CALL MOV
AX,DATA DS,AX ES,AX SP,TOP AH,09H
DX,OFFSET MESS 21H AH,02H DL,07H 21H GETNUM DX GETNUM DX GETNUM AX,DX DISP AH,02H
30
MOV INT POP POP CALL MOV MOV INT
MOV
CALL INT DISPP
PROC MOV MOV MOV MOV AND CALL MOV AND
CALL MOV AND CALL
RET DISPP ENDP DISPL PROC ADD CMP JB ADD DDD:
MOV INT
RET DISPL ENDP DISP PROC PUSH PUSH PUSH PUSH MOV CALL
POP
DL,’–’ 21H
DX
AX DISPP AH,02H DL,’–’ 21H AX,DX DISPP 21H NEAR BL,AL DL,BL CL,04 DL,CL DL,0FH DISPL DL,BL DL,0FH DISPL DL,BL DL,0FH
DISPL
NEAR DL,30H DL,3AH DDD DL,27H AH,02H
21H
NEAR BX CX DX
AX AL,AH DISPP
AX
31
CALL POP POP POP
RET DISP ENDP GETNUM PROC PUSH XOR GGG:
MOV INT CMP JZ CMP JZ SUB JB CMP JB SUB CMP JBE JB CMP JA SUB GETS:
MOV SHL XOR ADD JMP KKK:
MOV MOV INT
PPP: PUSH
CRLF POP POP
RET GETNUM ENDP CODE ENDS END START
DISPP
DX CX BX
NEAR CX DX,DX AH,01H 21H AL,0DH PPP AL,20H PPP
AL,30H KKK AL,11H
KKK
AL,07H AL,0FH
GETS KKK AL,2FH KKK
AL,20H CL,04H DX,CL
AH,AH DX,AX GGG
AH,09H
DX,OFFSET ERROR 21H
DX DX CX
32
五、实验要求
1.弄清程序中的堆栈调用顺序,写出程序注释。 2.修改程序,使年月日的显示顺序和输入顺序一致。
33
因篇幅问题不能全部显示,请点此查看更多更全内容