首页 > 范文大全 > 正文

基于仿真技术的MCS―51单片机相对寻址问题的探讨

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于仿真技术的MCS―51单片机相对寻址问题的探讨范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:文章利用仿真软件对mcs-51单片机指令中的相对寻址方式中偏移量的形成做了分析,就汇编指令中相对寻址指令中的‘rel’的本质通过Protues和伟福软件仿真进行了探求。经过仿真软件验证,指出相对寻址指令中的‘rel’在汇编指令中为目的地址,和机器代码中的实际偏移量并非为同一数值。

关键词:MCS-51单片机;相对寻址;偏移量;汇编语言;机器码

【中图分类号】G640

1 前言

MCS-51系列单片机作为经典的单片机应用十分广泛,其指令总共有111条。其指令中对操作数的寻址方式有7种,分别为立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址[1-4,5~8]。在学习相对寻址的内容和有关相对寻址的指令时,许多初学者会对于偏移量的值和跳转目的地址的值混淆不清,产生疑惑和不解。许多教材对此问题的解释也不一致,甚至有错误,这加深了初学者的困惑和理解错误。仿真技术在电子电路设计中得到了广泛的应用,利用Protues、伟福软件等可以很直观的展示程序的执行过程。为了揭示相对寻址的本质,本文将利用Protues仿真软件和伟福软件的仿真功能对相对寻址进行剖析。

2 相对寻址执行过程的探讨

相对寻址方式是为了程序的相对转移而设计的,其过程是以当前PC的内容为基址,加偏移量作为转移地址,从而实现程序的转移。转移的目的地址取决于表达式:目的地址=转移指令地址+转移指令字节数+偏移量。需要注意的是,偏移量是有正负号之分的,偏移量的取值范围是当前PC值的-128~+127之间。该表达式应这样理解:在执行转移指令语句时,PC的内容是转移指令的下一条指令的地址值,该地址值加上要偏移的地址字节数形成新目的地址,然后程序跳转到新的目的地址,其中要偏移的地址字节数为8位有符号数二进制数,即偏移量在-128~+127之内。那么这个偏移量是如何得到的呢?在许多教材和文章中均以rel作为相对寻址的标志,这些教材和文章对相对寻址的解释都很相似,其解释为:以程序计数器PC的当前值为基址,加上汇编指令中给出的相对偏移量rel,形成新的PC值,即跳转目的地址,相对偏移量rel为一字节补码数,其表示范围为-128~+127[1-8]。举例来说明此问题,如下面的汇编语言程序语句:

ORG 0200H

MOV A,#36 ;双字节指令

JNZ 30H ;双字节指令

按这些教材和文章中的解释,执行指令JNZ 08H时PC值变为0202H+2,30H就是相对偏移量,该指令执行后程序应该跳转到目的地址=0202H(转移指令地址)+2(转移指令JZ的字节数)+30H(偏移量)=0232H上。事实上这种解释是错误的,该跳转指令执行后程序不会跳转到计算出的目的地址上去。笔者认为应该是:进行相对寻址时,确实是以PC的当前值作为基址,加上相对偏移量形成新的目的地址,但是在汇编指令中并不能直接看出相对偏移量,这个偏移量体现在机器码中;而汇编指令中的rel,不管是数值形式还是符号形式只能是目的地址值,且其距离在当前PC值-128~+127的范围内。

3相对寻址执行过程的Protues仿真验证

为了看清楚相对转移指令的偏移量值的本质,以一段程序在Protues仿真软件下来观察其跳转过程,验证程序及其各指令占用地址如下:

ORG 0000H

0000H MOV A,#1

0002H JNZ 08H

0004H SJMP $

ORG 0008H

0008H INC A

0009H MOV B,#2

000CH SUBB A,B

000EH SJMP $

END

将程序加载到Protues仿真软件中放的80C51单片机中,经编译后执行调试,调出程序代码窗口,按F11键单步调试操作来观察程序的跳转情况。程序首句给A赋值为1,如果按照rel为偏移量的解释,那么执行指令JNZ A,08H时,当前PC值为0004H,加上偏移量08H,那么目的地址就应该000CH,单步操作是程序将跳转到SUBB A,B指令上。Protues仿真结果如图1所示。

从图中可以看出,在执行了相对转移指令后,程序并没有跳转到地址000CH上,而是跳到了地址0008H。说明了执行有关相对寻址指令时,指令中的rel并不是真正的偏移量,而是程序跳转的目的地址,当然该rel完全可以用标号来代替,因为标号可以代替绝对地址。

比如,将上例中的0008H用标号AA来代替,那么仿真结果如图2所示。

从上面仿真过程可以看出,执行相对转移指令时,教材中所说指令中的rel并非是偏移量,那么这个偏移量在哪儿呢?

4 相对转移指令的机器码

因为Protues软件下无法查看程序的机器代码,为了能够观察到前面程序的机器代码,对前面程序段在伟福软件下进行编译,来对其机器代码进行观察,其机器代码如图3所示。可以看出JNZ 08H对应的机器码为7004H,其中70H为操作码,04H为偏移量。这个04H是如何得出的呢?其实偏移量等于跳转的目的地址减去当前PC值。此例中,执行JNZ 08H时PC为下一条指令地址,即SJMP $的地址0004H,目的地址为0008H,偏移量=0008H-0004H=0004H。所以执行程序JNZ A,08H时,程序跳转到了目的地址为0008H的语句。

图3 程序的机器代码

由以上分析与仿真结果可知,在相对转移指令中,偏移量rel是体现在机器码中,并非直接体现在汇编指令中。在机器码中的偏移量不能直接拿来作为汇编指令中的偏移量,而汇编语言指令中的rel只能是跳转的目的地址。

5结论

MCS-51单片机的相对寻址的汇编指令中,操作数rel不是真正的偏移量,而是跳转的目的地址,该地址可以以数值或目的地址标号的形式给出,但其范围不能超过当前PC值-128~+127的范围。真正的偏移量体现在机器码中,对机器码而言,目的地址=当前的PC值+机器码中的偏移量,当前的PC值是跳转指令下一条指令的首地址。也就是说,汇编语言经编译软件编译时,将计算出的实际偏移量写入机器码中。所以机器码中的偏移量和汇编指令中的rel并不是同一个值。

参考文献:

[1] 高玉芹. 单片机原理与应用及C51编程技术.北京:机械工业出版社,2011.6

[2] 牛昱光,等.单片机原理与接口技术.北京:电子工业出版社, 2008.2

[3] 郭文川. 单片机原理与接口技术. 北京:中国农业出版社,2007.8

[4] 姜志海,等. 单片机原理及应用. 北京:电子工业出版社,2005