5控制转移指令实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.5 控制转移指令实验
一、实验目的
·掌握无条件转移指令和条件转移指令的使用。
·掌握调用指令和返回指令的使用。
·掌握用Keil调试汇编源程序的方法。
·掌握用Proteus调试汇编源程序的方法。
二、实验预备知识
无条件转移指令是指当程序执行到该指令时,程序无条件转移到指令所提供的地址处执行。有长转移指令( LJMP)、绝对转移指令(AJMP)和相对转移指令(SJMP)三种。
条件转移指令是指根据给出的条件进行判断,若条件满足,则程序转向由偏移量确定的目的地址处去执行;若条件不满足,程序将不会转移,而是按原顺序执行。相对偏移量为一个带符号的8位数,偏移范围为-128~十127,共256个字节。共有三种:
◇累加器A判零转移指令(JZ、JNZ)。该指令对累加器A的内容为零和不为零进行检测并转移,不改变累加器A的内容,也不影响任何标志位。
◇减l非零转移指令又称循环转移指令( DJNZ)。该指令是把源操作数减1,结果送回到源操作数中去;并判断结果是否为O,若不为O则转移到目标地址,继续执行循环程序;若为0则终止循环程序的执行。
◇比较转移指令(CJNE)。该指令对指定的目的字节和源字节进行比较,若它们的值不相等,则转移。
把具有一定功能的公用程序段作为子程序,在主程序中采用调用指令( LCALL、 ACALL)调用子程序,子程序的最后一条指令为返回主程序指令(RET)。
长调用指令( LCALL)的执行过程是先将(PC)+3→PC,指向下一指令地址;再将把下一指令的16位地址(断点)压入堆栈,先压人PC0~7低位地址,后压入PC8~15高位地址,(SP)十2→SP;最后将指令中给出的16位目标地址addr16送入程序计数器PC。从而使程序转向目标地址addr16去执行被调用的子程序。
子程序返回指令(RET)的作用是将栈顶的断点地址送PC,于是,子程序返回主程序继续执行。
三、实验内容
根据控制转移类指令的不同用途,分别编写二个小程序,以完成程序在不同条件下的转移、调用。
1.参考程序1——累加器A判零转移指令和无条件转移指令
(1)将立即数#01H传送至A中。
(2)判断A中的内容,若(A)=OOH,则顺序执行MOV A,#02H指令;若(A)≠ OOH,则转移执行DEC A指令;循环往复执行相关指令。
2.参考程序2——减1非零转移指令、调用指令和返回指令
(1)将片内RAM20H~22H单元全部送入立即数#11H。
(2)调用子程序将立即数#55H传送至片内RAM22H单元中。
(3)返回主程序将立即数#55H分别传送至片内RAM20H、21H单元中。
四、买验参考程序
参考程序l:累加器A判零转移指令和无条件转移指令
参考程序2:减1非零转移指令、调用指令和返回指令
五、实验步骤
1.用实验系统完成实验的步骤
(1)输入源程序。按第1.2.2节单片机实验系统的使用方法进行操作。
(2)单步运行程序。即每按一次单步运行键,只执行一条指令。
(3)每执行一条指令后,根据参考程序检查数据栏要求检查每条指令的执行结果,以加深对控制转移指令的理解。
2.用Keil软件完成实验的步骤
(1)建立工程文件,选择单片机。工程文件名为“jump”,选择单片机型号为Atmel的89C51。
(2)建立源文件,加载源文件。源文件名为“jump. ASM”。
(3)设置工程的配置参数。“目标”标签页的晶振频率栏设为12MHz,“输出”标签页的生成HEX文件选择框选中。
(4)进行编译和连接。
(5)进入调试模式,打开存储器窗口。存储器#1窗口显示以地址OOH开始的片内j
RAM各个存储单元。
(6)单步运行程序。单击“调试”一“单步”或调试工具栏的单步按按钮,通过存储器窗口和工程窗口的寄存器标签页观察每条指令执行后数据处理的结果,以加深对控制转移指令的理解。程序调试窗口如图2-6所示。
3.用Proteus软件完成实验的步骤
(1)新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“jump”。
(2)选取元器件。从Proteus元器件库中选取元器件AT89C51(单片机)。
(3)放置元器件、编辑元器件、放置终端、连线。按图2-8所示放置元器件并连线。
(4)添加源程序、编辑源程序、编译源程序。源文件名为“jump. ASM”。
(5)加载目标代码文件。“Clock Frequency”栏中的频率要设为12MHz。
(6)仿真。单击仿真工具栏“单步运行”按钮》,进入单步运行状态。分别打开工作寄存器窗口、特殊功能寄存器窗口、片内数据存储器窗口和源代码调试窗口。
单击源代码调试窗口“单步执行”按按钮一次,执行一条指令,通过各调试窗口观察每条指令执行后数据处理的结果,以加深对控制转移指令的理解。程序调试窗口如图2-8所示。
六、实验分析
1.分析参考程序1中实现无限循环的原因。
2.分析两个参考程序中的累加器A判零转移指令和减1非零转移指令的偏移量的区别。
七、实验思考
1、若将参考程序1中的指令JNZ L2改为CJNE A,#OOH,L2,参考程序1的执行结果如何?
2、若将参考程序2中的指令LCALL L1改为ACCALL L1,该指令的机器码如何翻译?