汇编语言分支结构程序设计
- 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 DB70H,58H,50H,91H,99H,62H,75H,82H,74H,60H ;定义BUF单元地址开始得缓冲区得数据
ORG 0020H ;程序执行时,将P1送到0200H内存单元
P1DB 0
ORG 0030H ;程序执行时,将P2送到0300H内存单元
P2DB0
ORG0040H
P3 DB 0 ;程序执行时,将P3送到0400H内存单元
ORG 0050H ;程序执行时,将DP1送到0500H内存单元
DP1 DB’P1= $'
ORG0060H ;程序执行时,将DP2送到0600H内存单元
DP2 DB'P2= $'
ORG0070H ;程序执行时,将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
MOVCX,COUNT ;设置计数器CX,最多为10
MOV SI,0 ;给SI赋值为0
LP1:
MOV AL,BUF[SI] ;将BUF内存单元得第si个内容赋值给AL
CMPAL,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:INCSI ;将SI进行+1操作,即下一个成绩分数 LOOP LP1 ;循环LP1
LEADX,DP1
MOVAH,09H
INT 21H
MOV DL,P1
ADDDL,30H ;转对应得ASCII值
MOVAH,2
INT 21H ;将P1数据转10进制输出
LEA DX,DP2
MOVAH,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
MOVDL,P3
ADDDL,30H;转对应得ASCII值
MOV AH,2
INT 21H
MOVAH,4CH
INT21H ;将P3数据转10进制输出
CSEG ENDS
ENDSTART
对上述程序加上注释,并运行观察结果。
运行结果:
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
DATAYDB 2H
ﻩRLTDB1DUP(?)
;此处输入数据段代码
DATAS ENDS
CODES SEGMENT
ASSUMECS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOVDS,AX ;将DATAS中得数据存入DS
MOV BL,DATAX ;将DATAX送入BL
MOV BH,DATAY ;将DATAY送入BH
MOVAH,01H
int 21H ;DOS功能调用,等待键盘输入一个值
CMP AL,’+’
JE addition ;若输入符号为'+’,则跳转到addition CMPAL,’-’
JE subtraction;若输入符号为’—’,则跳转到subtractionCMPAL,'*'
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:
MOVAL,BH
MUL BL ;将BL,BH内容相乘
MOV BL,AL
JMP print
division:
MOVAL,BL
SUBAH,AH
DIV BH ;将BL,BH内容相除
MOV BL,AL
JMP print
print:
MOV AL,BL
MOVCL,4
SHR AL,CL ;将AL数据逻辑右移4位
ADD AL,30H ;将AL数据转为对应ASCII值
CMP AL,39H ;比较AL中数据与39H得大小
JBE look1 ;当AL〈=39H时,跳转到look1
ADD AL,07H ;>=39H,则只加07H
look1:
MOV DL,AL
MOV RLT,AL
MOVAH,02H
INT 21H
MOVAL,BL