汇编语言分支结构程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七分支结构程序设计
一、实验目的
掌握条件转移指令的使用方法及指令对标志寄存器中各标志位的影响;掌握标志位和转移指令之间的关系;会用条件转移指令和无条件转移指令设计多分支结构程序;掌握设置断点调试程序的方法。
二、示例
1、存自BUF单元开始的缓冲区连续存放着10个学生的英文分数,编程序统计其中90~100,
60~89,60以下者各有多少人?并把90-100分人数结果存放在P1单元中、60-89分人数结果存放在P2单元中,60分以下人数结果存放在P3单元中(P1、P2、P3为数据段的单元),最后把P1、P2、P3中的数以”P1=?、P2=?、P3=?”显示在屏幕上。(注:数据以10进制显示)
DATA SEGMENT
BUF DB 70H,58H,50H,91H,99H,62H,75H,82H,74H,60H ;定义BUF单元地址开始的缓冲区的数据
ORG 0020H ;程序执行时,将P1送到0200H存单元
P1 DB 0
ORG 0030H ;程序执行时,将P2送到0300H存单元
P2 DB 0
ORG 0040H
P3 DB 0 ;程序执行时,将P3送到0400H存单元
ORG 0050H ;程序执行时,将DP1送到0500H存单元
DP1 DB'P1= $'
ORG 0060H ;程序执行时,将DP2送到0600H存单元
DP2 DB'P2= $'
ORG 0070H ;程序执行时,将DP3送到0700H存单元
DP3 DB'P3= $'
ORG 0080H ;程序执行时,将COUNT送到0800H存单元
COUNT DW 10 ;'$'为地址运算符,返回当前程序语句的地址偏移值DATA ENDS;定义数据段
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
PUSH DS ;将DS压入堆栈
SUB AX,AX;将AX存器容清空
PUSH AX
START:MOV AX,DATA
MOV DS,AX ;将数据传给数据段DS
MOV CX,COUNT ;设置计数器CX,最多为10
MOV SI,0 ;给SI赋值为0
LP1:
MOV AL,BUF[SI] ;将BUF存单元的第si个容赋值给AL
CMP AL,90H ;判断该学生的分数是否>=90
JNB LP2 ;若不低于90则跳转到LP2
CMP AL,60H ;判断该学生的分数是否>=60
JC LP3 ;若产生进位则跳转到LP3
INC P2 ;将分数在60-89的学生的分数个数存放到P2中 JMP LP5 ;跳转到LP5,即循环遍历数组BUF
LP3: INC P3 ;将P3中的个数+1
JMP LP5 ;跳转到LP5
LP2: INC P1 ;给P1中的个数+1
LP5: INC SI ;将SI进行+1操作,即下一个成绩分数
LOOP LP1 ;循环LP1
LEA DX,DP1
MOV AH,09H
INT 21H
MOV DL,P1
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H ;将P1数据转10进制输出
LEA DX,DP2
MOV AH,09H
INT 21H
MOV DL,P2
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H ;将P2数据转10进制输出
LEA DX,DP3
MOV AH,09H
INT 21H
MOV DL,P3
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H ;将P3数据转10进制输出
CSEG ENDS
END START
对上述程序加上注释,并运行观察结果。
运行结果:
BUF开始的存单元的10个数中有2个>=90,6个在60-89,2个在60以下
验证正确
三、实验题
1已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
四、实验报告
1、总结调试分支程序的方法;
2、写出程序清单,并记录执行结果。
解:
1.总结调试分支程序的方法
将每个分支的功能编写清楚后,根据运行结果与自身判断结果相比较,若有误,则单步执行程序,观察程序运行的每一步结果变化是否和自身想象的一样。
2.已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
程序代码:
DATAS SEGMENT
DATAX DB 9H
DATAY DB 2H
RLT DB 1 DUP(?)
;此处输入数据段代码
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX ;将DATAS中的数据存入DS
MOV BL,DATAX ;将DATAX送入BL
MOV BH,DATAY ;将DATAY送入BH
MOV AH,01H
int 21H ;DOS功能调用,等待键盘输入一个值
CMP AL,'+'
JE addition ;若输入符号为'+',则跳转到addition CMP AL,'-'
JE subtraction;若输入符号为'-',则跳转到subtraction CMP AL,'*'
JE multiplication;若输入符号为'*',则跳转到multiplication CMP AL,'/'
JE division ;若输入符号为'/',则跳转到division
addition:
ADD BL,BH ;将BL,BH容相加
JMP print ;跳转到输出过程
subtraction:
SUB BL,BH ;将BL,BH容相减
JMP print
multiplication:
MOV AL,BH
MUL BL ;将BL,BH容相乘
MOV BL,AL
JMP print
division:
MOV AL,BL
SUB AH,AH
DIV BH ;将BL,BH容相除
MOV BL,AL
JMP print
print:
MOV AL,BL
MOV CL,4
SHR AL,CL ;将AL数据逻辑右移4位
ADD AL,30H ;将AL数据转为对应ASCII值
CMP AL,39H ;比较AL中数据与39H的大小
JBE look1 ;当AL<=39H时,跳转到look1