【微机原理】实验三 分支程序实验

一. 实验要求

利用Proteus平台,建立8086的分支程序的例子。

二. 实验目的

  1. 熟悉实验系统的编程和使用。
  2. 掌握使用转移类指令编程及调试方法。
  3. 掌握各种标志位的影响。

三. 实验说明

由于本实验是通过改变两个变量CON_A和CON_B的大小,实现用CMP指令对不同标示位的影响的一个转移,分别设有大于、等于、小于。

四. 实验程序流程图

Created with Raphaël 2.2.0将CON_A移入AX,CON_B移入BX使用CMP比较AX,BXCF为0CON_A > CON_B,进行跳转结束ZF为1CON_A = CON_B,进行跳转CF为1CON_A < CON_B,进行跳转yesnoyesnoyes

五. 实验步骤

a.仿真代码

;改变CON_A和CON_B 的大小,实验程序的不同分支
 CODE SEGMENT
      ASSUME CS:CODE
CON_A EQU  25
CON_B EQU  12       
START:  
      MOV AX,CON_A
      MOV BX,CON_B
      CMP AX,BX;比较AX,BX
      JNC MO_T  ;AX > BX 跳转
      JE  EQUA  ;AX = BX 跳转
      JC  LESS  ;AX < BX 跳转
MO_T: JMP $   
EQUA: JMP $
LESS: JMP $
CODE ENDS
      END START

b.调试、验证

最初将25赋给AX,12赋给BX,分别为19H、0CH。寄存器窗口最下一行FL表示标志寄存器,此图表示运行CMP指令后,仅AF为1,其余位为0
在这里插入图片描述
发现跳转到了AX>BX的情况.正确。
在这里插入图片描述
然后我们修改代码,令AX为2进行测试,发现CF、PF、AF、SF均为1
在这里插入图片描述
程序跳转到了AX<BX的情况

在这里插入图片描述

我们再令AX等于12,进行测试,发现PF、ZF均为1

在这里插入图片描述

程序依然跳转到AX>BX的情况下,这是因为CF=0.故该程序出现逻辑错误。应当将JE语句放置于JNC语句之前。

六. 实验结果和体会

实验结果见上方。我们发现当输入相等时,该程序会出现判断失误。这是由于AX大于或等于BX时,CF均为0.应当先判断AX是否等于BX。

所以汇编语言在分支程序下极容易出现这种逻辑错误,需要我们仔细检查,并使用不同数据进行测试

七. 扩展题目程序和实验结果

;使用五个输入测试SGN函数,实验程序的不同分支
 CODE SEGMENT
      ASSUME CS:CODE,DS:DATA    
START:
      MOV AX,DATA
      MOV DS,AX;设置段寄存器
      MOV CX,5 ;5个输入对应5个循环
      MOV SI,OFFSET NUM;SI作为下标
LOP:
      MOV AL,0;AL置0被用于比较。注意由于输入数据是BYTE,因此以下寄存器用低位即可
      MOV DL,[SI];取出当前输入进DL
      CMP DL,AL;将DL与0比较
      JG MO_T  ;DX > 0 跳转。JG、JL可判断有符号数据
      JE  EQUA  ;DX = 0 跳转
      JL  LESS  ;DX < 0 跳转
MO_T: MOV BYTE PTR[SI+5],1;将结果存入空白内存
      JMP IF_END;跳转到IF语句的结束
EQUA: MOV BYTE PTR [SI+5],0
      JMP IF_END
LESS: MOV BYTE PTR [SI+5],-1
      JMP IF_END
IF_END:
      INC SI;下标自增
      LOOP LOP;循环
CODE ENDS
DATA SEGMENT
NUM DB 24H,13H,00H,0FFH,0ABH ;
SGNX DB 5 DUP(?);用于存储输出结果
DATA ENDS
      END START          

输出结果为1、1、0、-1、-1.结果正确。
在这里插入图片描述
整个程序运行到最后,可以看到DX的低字节保存着最后一个输入ABH。CX=0表示结束循环。SI在结束循环前又自增一次故为5H,但只有它等于0到4时是被作为下标使用的。

确。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章