一、实验目的
掌握条件转移指令的使用方法及指令对标志寄存器中各标志位的影响;掌握标志位和转移指令之间的关系;会用条件转移指令和无条件转移指令设计多分支结构程序;掌握设置断点调试程序的方法。
二、示 例
内存自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 SEGMENTBUF DB70H,58H,50H,91H,99H,62H,75H,82H,74H,60H//定义BUF为10个学生成绩ORG 0020H //将P1定位在0020H位置P1 DB 0//令P1为0ORG 0030H//将P2定位在0030H位置P2 DB 0//令P2为0ORG 0040H//将P3定位在0040H位置P3 DB 0//令P3为0ORG 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 DW10//计数10DATA ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DATA//CSEG放入CS中,DATA放入DS中PUSH DS//将DS压入堆栈SUB AX,AX//AX清零PUSH AX//将AX压入堆栈START:MOV AX,DATAMOV DS,AX//将DATA数据放入DS数据段中MOV CX,COUNT//将COUNT即10放进CX,计数MOV SI,0//将偏移地址SI设定为0LP1: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中的数自增1JMP LP5//转移到LP5处LP2: INC P1//将P1中的数自增1LP5: INC SI//将SI中的数自增1LOOP LP1//循环LP1LEA DX,DP1 MOV AH,09HINT 21HMOV DL,P1ADD DL,30H//bcd码转换成ASCII码, 打印出来MOV AH,2INT 21H//将P1数据转10进制输出LEA DX,DP2MOV AH,09HINT 21HMOV DL,P2ADD DL,30H//bcd码转换成ASCII码, 打印出来MOV AH,2INT 21H//将P2数据转10进制输出LEA DX,DP3MOV AH,09HINT 21HMOV DL,P3ADD DL,30H//bcd码转换成ASCII码, 打印出来MOV AH,2INT 21H//将P3数据转10进制输出MOV AH,4CHINT 21H//显示输出CSEG ENDSEND START
结果截图:
三、实验题
要求:复制粘贴编写的代码(可以加必要的注释),并给出实际运行截图。
1已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
DATAS SEGMENTDATAX DB 9HDATAY DB 2HRLT DB 1 DUP(?) //此处输入数据段代码 DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART: 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 //若输入符号为'/',则跳转到divisionaddition: 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,则只加07Hlook1: 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,07Hlook2: MOV DL,AL MOV RLT,AL MOV AH,02H //dos功能调用,输出DL INT 21H ;此处输入代码段代码 MOV AH,4CH INT 21HCODES ENDS END START