一、实验目的
掌握条件转移指令的使用方法及指令对标志寄存器中各标志位的影响;掌握标志位和转移指令之间的关系;会用条件转移指令和无条件转移指令设计多分支结构程序;掌握设置断点调试程序的方法。
二、示 例
- 内存自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为10个学生成 绩
ORG 0020H //将P1定位在0020H位置
P1 DB 0 //令P1为0
ORG 0030H //将P2定位在0030H位置
P2 DB 0 //令P2为0
ORG 0040H //将P3定位在0040H位置
P3 DB 0 //令P3为0
ORG 0050H //将DP1定位在0050H位置
DP1 DB 'P1= $' //令DP1的值为字符串P1= $
ORG 0060H //将DP1定位在0060H位置
DP2 DB 'P2= $' //令DP1的值为字符串P2= $
ORG 0070H //将DP1定位在0070H位置
DP3 DB 'P3= $' //令DP1的值为字符串P3= $
ORG 0080H //定位0080H处
COUNT DW 10 //计数10
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA //CSEG放入CS中,DATA放入DS中
PUSH DS //将DS压入堆栈
SUB AX,AX //AX清零
PUSH AX //将AX压入堆栈
START:MOV AX,DATA
MOV DS,AX //将DATA数据放入DS数据段中
MOV CX,COUNT //将COUNT即10放进CX,计数
MOV SI,0 //将偏移地址SI设定为0
LP1:
MOV AL,BUF[SI] //将BUF[SI]中的数即70H放进AL中
CMP AL,90H //比较AL中的数和90H的大小
JNB LP2 //若AL不小于90H,则转移到LP2处
CMP AL,60H //比较AL中的数和60H的大小
JC LP3 //若产生进位,则转移到LP3处
INC P2 //将分数在60-89的学生的分数个数存放到P2中
JMP LP5 //转移到LP5处
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 //bcd码转换成ASCII码, 打印出来
MOV AH,2
INT 21H //将P1数据转10进制输出
LEA DX,DP2
MOV AH,09H
INT 21H
MOV DL,P2
ADD DL,30H //bcd码转换成ASCII码, 打印出来
MOV AH,2
INT 21H //将P2数据转10进制输出
LEA DX,DP3
MOV AH,09H
INT 21H
MOV DL,P3
ADD DL,30H //bcd码转换成ASCII码, 打印出来
MOV AH,2
INT 21H //将P3数据转10进制输出
MOV AH,4CH
INT 21H //显示输出
CSEG ENDS
END START
结果截图:
三、实验题
要求:复制粘贴编写的代码(可以加必要的注释),并给出实际运行截图。
1已知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
ADD AL,07H //>=39H,则只加07H
look1:
MOV DL,AL
MOV RLT,AL
MOV AH,02H
INT 21H
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,39H
JBE look2
ADD AL,07H
look2:
MOV DL,AL
MOV RLT,AL
MOV AH,02H //dos功能调用,输出DL
INT 21H
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START