《微处理器》实验报告
学院:
班级:
姓名:
学号:
实验一 循环程序实验
-
实验要求
利用PROTEUS平台,建立8086 的循环程序的例子。
-
实验目的
1、熟悉实验系统的编程和使用。
2、掌握使用LOOP判断转移指令实验循环的方法。
3、掌握使用LOOP与CX的组合。
-
实验说明
由于本实验是通过给CX一个数值,再通过LOOP作一个判断CX-1是否为0的转移,实现程序的循环,循环的内容是执行AX+1, 所以结果应该为AX 最后大小为开始时给定CX的大小。
- 实验程序流程图
-
实验步骤
1、Proteus仿真
a.在Proteus中打开设计文档“循环程序.pdsprj”;
b.单步运行,打开调试窗口进行调试。
参考程序:
CODE SEGMENT
ASSUME CS:CODE
CON_A EQU 25
CON_B EQU 12
START:
MOV AX,0 ;对AX清零,用于记录当前是第几次循环
MOV CX,5 ;设置循环次数,不可以用别的寄存器,是LOOP语句指定的
INC_AX: NOP ;LOOP将会跳转到该标签
INC AX ;循环一次 AX+1
LOOP INC_AX ;CX-1 ?=0 不等于循环至INC_AX处
JMP $ ;原地无限循环
CODE ENDS
END START
2、调试、验证
a.设置断点、单步运行程序,一步一步调试;
b.观察每一步运行时,8086内部寄存器的数值变化;
c.改变CX的赋值大小,观察AX的变化;
d.检查验证结果。
a.
给AX和CX赋初值,对AX清零,CX赋值为5,设置循环次数。
b.
经过AX自增语句及LOOP语句后,跳转回了NOP语句,发现AX加一,CX减一。此后以此类推。
若是在AX执行后,LOOP执行前暂停,就会发现AX加一,但CX未加。这证明了正是LOOP语句对CX进行了减一的操作。
c.
改变CX的赋值大小后,观察到AX的最终值随着CX的赋值大小变化,CX赋值变大,AX结果变大;CX赋值变小,AX结果值随之变小,跳出循环后CX均为零。
d.
-
实验结果
最初AX初始化为0,CX赋值为5,经过AX自增语句及LOOP语句后,跳转回了NOP语句,发现AX加一,CX减一。此后以此类推。若是在AX执行后,LOOP执行前暂停,就会发现AX加一,但CX未加。这证明了正是LOOP语句对CX进行了减一的操作。
经过五次循环后,最终结果如图,AX等于5,表示循环了5次,而跳出循环后,CX一定为0。
MOV AX,0 ;对AX清零,用于记录当前是第几次循环;MOV CX,5 ;设置循环次数,不可以用别的寄存器,是LOOP语句指定的;INC_AX: NOP ;啥也不做,LOOP将会跳转到该标签;INC AX ;循环一次 AX+1;LOOP INC_AX ;CX-1 ?=0 不等于循环至INC_AX处;JMP $ ;原地无限循环。
-
心得体会
在这次实验中,我掌握了使用LOOP判断转移指令实验循环的方法,也掌握了使用LOOP与CX的组合:
LOOP语句之所以先减后判断CX是否为0,就是为了CX中的数值能刚好对应循环次数,便于用户的使用。
在这次的程序中INC AX语句的位置可以替换成任何需要被多次调用的程序。
使用INC语句的原因有以下几点:1.在8086平台上,运行速度比ADD快2.代码所占内存小3.INC不改变符号位,而ADD会,如果循环体中需要用到CF,可能就会因为这点出现问题。
通过这次实验,我熟悉了实验系统的编程和使用,并且掌握了利用PROTEUS平台,建立8086 的循环程序的方法,学会了如何插入断点并单步运行程序。
这次的实验不仅巩固了我的理论知识,而且让我体验到了将理论运用到实践中的乐趣,让我受益匪浅。