微机原理实验4

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

【调试说明】

相关文档
最新文档