一. 实验要求
利用Proteus平台,建立8086的分支程序的例子。
二. 实验目的
- 熟悉实验系统的编程和使用。
- 掌握使用转移类指令编程及调试方法。
- 掌握各种标志位的影响。
三. 实验说明
由于本实验是通过改变两个变量CON_A和CON_B的大小,实现用CMP指令对不同标示位的影响的一个转移,分别设有大于、等于、小于。
四. 实验程序流程图
五. 实验步骤
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时是被作为下标使用的。
确。