汇编语言及应用——分支结构程序设计

一、实验目的

掌握条件转移指令的使用方法及指令对标志寄存器中各标志位的影响;掌握标志位和转移指令之间的关系;会用条件转移指令和无条件转移指令设计多分支结构程序;掌握设置断点调试程序的方法。

二、示 例

  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为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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值