搜索
您的当前位置:首页正文

微机原理实验

来源:筏尚旅游网


明理工大学

微机原理及程序设计

实验指导书

段绍米 编

昆明理工大学信息工程与自动化学院

自动化系 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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top