微机原理实验4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四:分支、循环程序设计
一. 实验目的
1.学习分支程序、循环结构程序的设计和调试方法;
2.学习子程序的定义和调试方法;
3.掌握分支、循环、子程序等程序的基本结构。
二. 实验设备
TDN 86/51或TDN 86/88教学实验系统一台
三. 实验内容、步骤及要求
1. 设计一数据块间的搬移程序
数据块搬移的基本原则为:
对于两个分离的数据块,从首地址或从末地址开始传送均可。
对于有部分重叠的情况则:
当源数据块首地址>目的数据块首地址时,从数据块首地址开始传送数据。
当源数据块首地址<目的数据块首地址时,从数据块末地址开始传送数据。
2.求某数据区内负数的个数
设数据区的第一单元存放区内单元数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得区内所包含负数的个数。
3.学生成绩名次表
将分数为1~100之间的10个成绩存入首址为3000H的单元中,3000H+I表示学号为I的学生成绩。编写程序能在3100H开始的区域排出名次表,3100H+I为学号I的学生名次。
4. 求无符号字节序列中的最大值和最小值
设有一字节序列,其存储首地址为3000H,字节数为08H。利用子程序的方法编程求出该序列中的最大值和最小值。
四. 编程练习
(A) 在3500H单元开始中输入数据:09H(数据个数)12H、80H、78H、C8H、00H、00H、FEH、99H、34H,编写程序使其能分别求出数据区中的正数和负数以及零的个数,正数的个数放在3510H单元中,负数的个数放在3511H单元中,零的个数放在3512H单元中.
(B) 有三个8位二进制数连续存放在03200H开始的内存单元中,设它们之中至少有两个数是相同的。编写程序找出与另外两数不同的数,把该数所在的地址(段内偏移地址)送到03204H单元,若三个数都相同则送0FFFFH到03204H单元。
(C) 设数据段SCORE单元开始连续存放着20个学生成绩,编写程序统计其中<60,60~69、70~79、80~89,>90分数段的人数,并把统计结果存放到从TOT开始的数据块中。
(数据为:64H,61H,5DH,55H,52H,51H,44H,45H,47H,48H,4DH,4FH,3CH,3FH,40H,41H,33H,56H,59H,30H).
(D) 找出一个数据块中的最大数。数据块从偏移地址3002H开始存放,数据块的长度以16位二进制形式存放在3000H、3001H单元,把找出的最大数放到3100H单元中,并把存放最大值的偏移地址存入3101H和3102H的存储单元中。假设数据块中的数都是8位无符号数。
(E) X的值(字节数)分别由3000H、3001H、3002H单元的数决定,对应的结果Y分别存放在3005H、3006H、3007H单元中,完成下列方程:
A (X>0)
Y= {0 (X=0)
B (X<0)
(F) X的值(字节数)分别由3200H、3201H、3202H单元的数决定,对应的结果Y分别存放在3105H、3106H、3107H单元中,完成下列方程:
90H (X>200)
Y= { 50H (X=100)
00H (X<50)
五.软件流程图和程序清单
A)DATAS SEGMENT
ORG 3500H
BUFSIZE DB 9 ;单元数据个数
NUM DB 12H,80H,78H,0C8H,00H,00H,0FEH,99H,34H
ORG 3510H
RESULT DB 3 DUP(0,0,0)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV DI,OFFSET NUM ;送数据地址到DI
LEA BP,RESULT
MOV SI,00H
MOV CX,[3500H] ;循环次数
AGAIN:TEST BYTE PTR[DI],80H
JZ COUNT ;ZF=1,此数据为非负数,转移
INC BYTE PTR[BP+1] ;ZF=0,此数据为负数
JMP DONE
COUNT:CMP BYTE PTR[DI],01H
JNC NEXT
INC BYTE PTR[BP+2] ;CF=1,此数据为0
JMP DONE
NEXT: INC BYTE PTR[BP] ;CF=0,此数据为正数
DONE: INC DI
LOOP AGAIN
MOV AH,4CH
INT 21H
CODES ENDS
END START
【调试说明】
由图可见:正数个数为3,负数个数为4,零的个数为2。与答案相符
C)
DATAS SEGMENT
ORG 3700H
SCORE DB 64H,61H,5DH,55H,52H,51H,44H,45H,47H,48H, 4DH,4FH,3CH,3FH,40H,41H,33H,56H,59H,30H ORG 3720H
TOT DB 5 DUP(0,0,0,0,0)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,20 ;循环次数
MOV SI,OFFSET SCORE ;分数首地址送SI
BBB:MOV BP,OFFSET TOT
MOV AL,BYTE PTR[SI]
CLC
CMP AL,60
JNB S70 ;CF=0,大于60跳转
JMP DONE
S70: INC BP
CMP AL,70
JNB S80 ;CF=0,大于70跳转
JMP DONE
S80: INC BP
CMP AL,80
JNB S90 ;CF=0,大于80跳转
JMP DONE
S90: INC BP
CMP AL,90
JNB S100 ;CF=0,大于90跳转
JMP DONE
S100: INC BP
DONE:INC BYTE PTR[BP] ;对应分数段人数加1
INC SI
LOOP BBB
MOV AH,4CH
INT 21H
CODES ENDS
END START
【调试说明】