首页 理论教育 指令系统寻址方式-单片微机原理及接口技术

指令系统寻址方式-单片微机原理及接口技术

时间:2023-11-02 理论教育 版权反馈
【摘要】:下面介绍STC单片机指令系统的7种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、基址加变址间接寻址、相对寻址和位寻址。对该单元地址进行取数或存数的寻址方式称为直接寻址。该指令中的源操作数和目的操作数是通过寻址A和R0寄存器得到的,因此是寄存器寻址。

指令系统寻址方式-单片微机原理及接口技术

指令通常由操作码和操作数组成。也就是说,指令执行时大多数都需要使用操作数。操作数指出了参与运算的数或操作数所在的地址单元,如何从指定的地址中获得指令需要的操作数就是寻址。一般来说,寻址方式的多少是计算机功能强弱的重要标志,寻址方式越多,计算机的功能越强,灵活性越好,指令系统越复杂。下面介绍STC单片机指令系统的7种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、基址加变址间接寻址、相对寻址和位寻址。

1.立即寻址

立即寻址,即操作数以常数的形式直接出现在指令中。立即数(常数)作为指令的一部分,并与操作码一起存储在程序存储器中。程序执行时,可立即得到操作数,而不需要到寄存器或存储器单元中寻找或取数。指令中的立即数用“#”作前缀,立即数可以是8位或16位,可以用十进制十六进制二进制的形式表示。

978-7-111-51881-5-Chapter03-2.jpg

这三条指令的功能都是把一个立即数1FH送到累加器A中,分别用十六进制、十进制或二进制的形式表示立即数。这三条指令编译后对应的机器码和操作数都相同,其中机器码是74H,占用一个存储单元,立即数紧随其后作为指令的操作数,操作数是1FH,占用下一个存储单元。因此,这三条指令都是双字节指令,其机器码均为74H 1FH。

立即寻址主要用来给寄存器或存储单元赋初值,并且只能用于源操作数,而不能用作目的操作数。

立即数的数值范围:对工作寄存器和片内RAM单元赋初值范围为00H~FFH或0~256;对特殊功能寄存器,除DPTR赋初值范围为0000H~FFFFH外,其他的赋初值范围为00H~FFH或0~256;对片外RAM地址单元不能直接赋初值,即不能采用立即寻址,只能采用间接寻址赋初值,赋初值范围为00H~FFH或0~256。

2.直接寻址

在直接寻址方式的指令中,操作数直接用一个单元地址的形式给出。对该单元地址进行取数或存数的寻址方式称为直接寻址。

978-7-111-51881-5-Chapter03-3.jpg

该指令的功能是把片内RAM存储单元30H的内容取出送到累加器A中。在指令中直接给出了源操作数的地址30H,该指令的机器码为E5H 30H。

STC单片机的直接寻址方式只能支持8位二进制数表示的地址,因此直接寻址方式的寻址范围只限于以下三种地址:

1)对片内RAM的基本地址00H~7FH单元的访问要采用直接寻址。

2)对特殊功能寄存器SFR的访问要采用直接寻址。特殊功能寄存器SFR除了以单元地址的形式表示外,还可以采用寄存器符号的形式表示。例如,MOV A,90H表示把P1口(地址为90H)的内容传送给A,该指令也可以书写为MOV A,P1,其功能同样是把P1口的内容传送给A,因此,这两条指令的功能是等价的。

3)在程序存储器中程序的跳转或子程序调用要采取直接寻址。例如,长转移LJMP addr16指令和绝对转移AJMP addr11指令,长调用LCALL addr16指令和绝对调用ACALL addr11指令,指令中都直接给出了16位程序存储器地址或11位程序存储器地址。当CPU执行这样的指令时,程序计数器PC的整个16位或低11位将更换为指令中直接给出的地址,机器将按照访问所给定的程序存储器地址取指令或取数,并依次执行。

3.寄存器寻址

指令中包含寄存器名,并通过寄存器来读取或存储操作数的指令称为寄存器寻址。

978-7-111-51881-5-Chapter03-4.jpg

表示把工作寄存器R0中的内容传送给累加器A,也可以把累加器A的内容传送给工作寄存器R7。该指令中的源操作数和目的操作数是通过寻址A和R0寄存器得到的,因此是寄存器寻址。

寄存器寻址的范围:工作寄存器R0~R7,4组共32个可以采用寄存器寻址;特殊功能寄存器(如A、B、DPTR)也可以作为寄存器寻址。

4.寄存器间接寻址

指令中指出一个寄存器存储操作数的地址,通过寄存器访问该地址的方法称为寄存器间接寻址。

指令中包含了可间接寻址的寄存器,指令功能是把寄存器中的内容当作操作数的地址,并通过寄存器间接地对该地址进行读或写操作来完成指令功能。

978-7-111-51881-5-Chapter03-5.jpg

第一条指令把立即数30H存入R0寄存器中(即把R0指针指向30H单元)。第二条指令用R0作间接寻址,即把R0指针指到的30H地址单元的内容5FH取出来送入累加器A中,如图3-1所示。第三条指令是R0自加1为(R0)=31H,即R0指向31H单元。第四条指令用R0作间接寻址,作为目标操作数,即从A取出数据,存储到R0指向的地址单元中(即把A中的内容存储到31H单元,执行后30H和31H单元的内容都是5FH)。

寄存器间接寻址的范围:

1)工作寄存器中只有R0、R1可以作为寄存器间接寻址,当作单字节地址的数据指针。间接访问片内RAM的基本地址(00H~7FH)和扩展地址(80H~FFH)(对52子系列)时,必须采用@R0或@R1形式。

2)特殊功能寄存器中只有DPTR、SP能够作为寄存器间接寻址。其中DPTR数据指针当作双字节地址的数据指针,SP是堆栈指针。

3)对片外RAM的64 KB范围中的某个地址访问时,必须采用@DPTR形式,如MOVX A,@DPTR。对片外RAM的00~FFH范围地址的访问,可以采用@DPTR、@R0或@R1形式。

4)堆栈操作区采用寄存器间接寻址。堆栈操作有压栈指令(PUSH)和出栈指令(POP),通过堆栈指针SP作间接寻址实现堆栈地址单元中数据的压入和弹出。

5.基址加变址间接寻址

基址加变址间接寻址是把基址寄存器中的内容(即基本地址)和变址寄存器中的内容(即偏移量)相加后得到一个数据,把这个数据作为地址,并对该地址进行访问。这种寻址方式只能以DPTR或PC作基址寄存器,以累加器A作为变址寄存器,并把两者相加后形成16位数据作为操作数的地址。例如:MOVC A,@A+DPTR,假设A的内容为10H,DPTR的内容为1020H,程序存储器1030H单元内容为73H,则该指令执行的结果是把程序存储器1030H单元中的内容73H传送给A,如图3-2所示。

978-7-111-51881-5-Chapter03-6.jpg

图3-1 寄存器间接寻址示意图

978-7-111-51881-5-Chapter03-7.jpg(www.xing528.com)

图3-2 基址加变址寻址示意图

说明:

1)这种寻址方式是专门针对程序存储器的寻址方式,寻址范围可达到64 KB。多用在访问程序存储器中的数据表格或查表应用中。

2)这种寻址方式的指令只有三条:

978-7-111-51881-5-Chapter03-8.jpg

这三条指令都是单字节指令,其中前两条是读程序存储器单元指令,最后一条是无条件转移指令。

6.相对寻址

在相对寻址的转移指令中,给出了地址偏移量,以“rel”表示,是在当前程序计数器PC值加上偏移量,构成实际操作数目的地址,使程序转移到目的地址处执行。

相对寻址时PC值和偏移量的计算:

当前PC值是指相对转移指令的下一条指令的首地址。如果把相对转移指令作为源地址,则PC值=源地址+相对转移指令的字节数。例如,JNZ LOOP是判断累加器A是否为零的双字节指令,如果该指令地址为0101H,则执行该指令时,此时的PC值应为0103H。

偏移量是单字节用补码形式表示的有符号数,因此其相对值的范围为-128~127,负数表示从当前指令地址向上转移,最大可转移的偏移量rel=128-转移字节数。用二进制补码表示为rel=10000000-转移字节数。

【例3-1】 以下是一段10个单字节无符号数相加的程序代码,从源地址转移到目的地址的转移字节数为4,则偏移量rel=128-4=FCH(注意:最高位是符号位)。

978-7-111-51881-5-Chapter03-9.jpg

执行相对转移指令时,当前PC值为0108H+2=010AH,再通过该相对转移指令的执行结果,计算出下一条执行指令的目的地址,并存入PC中。当相对转移指令中R2减1不为零时,目的地址=PC+偏移量=0106H;为零时,目的地址就是当前PC所指出的地址。

对于正数偏移量表示从当前指令地址向下转移,最大可转移的偏移量rel=转移字节数(即从当前转移地址的下一条指令算起到目的地址之间的字节数)。

【例3-2】 以下是一段取出两个数相除的程序代码,从源地址转移到目的地址相隔10字节,则偏移量rel=0AH(注意:向下转移最大值为7FH)。

978-7-111-51881-5-Chapter03-10.jpg

执行相对转移指令时,当前PC值为0101H+2=0103H,再通过该相对转移指令的执行结果,计算出下一条执行指令的目的地址,并存入PC中。当满足条件时,目的地址=PC+偏移量=010DH;不满足条件时,目的地址就是当前PC所指出的地址。

所以,相对转移指令中偏移量的计算公式为:偏移量rel=目的地址-源地址-转移指令的字节数。

7.位寻址

STC单片机有位寻址能力,可以对数据位进行位操作。

例如,MOV C,20H是把位地址20H中的二进制值送到进位位C,也就是把24H.0的位值送入C中。

位寻址范围说明如下:

1)内部RAM中的位寻址区,即20H~2FH单元共128个位可以进行位操作,位地址为00~7FH。这些位在指令中有如下两种表示方法:

①位地址表示法,例如,MOV C,30H是把位地址30H送到C中。

②点操作符表示法(即单元地址加上位),例如,MOV C,26H.0,是把26H单元中的最低位送到C中。它与上一条指令是等价的。

2)特殊功能寄存器中的可寻址位。这些可寻址位在指令中有如下4种表示方法:

①直接使用位地址。例如,P1口有8位,这8位的位地址分别为90H~97H。

②位名称的表示方法。有些位有专用名称,可以用此名称表示该位。例如,PSW.6是AC标志位,可使用AC表示该位。

③点操作符表示法。例如,P1口字节地址为90H,表示第一位可以用90H.1,也可用P1.1表示;PSW的字节地址为D0H,表示第五位可以用0D0H.5,也可用PSW.5表示。

④用户自定义的位名称表示法。如用户可通过定义TEMP这个名称来代替20H.2位,这样在指令中就可以用TEMP来表示20H.2位。

综上所述,在STC单片机的存储空间中,指令究竟对哪个存储器地址进行操作是由指令的操作码和寻址方式确定的。七种寻址方式及使用空间见表3-1。

表3-1 七种寻址方式及使用空间

978-7-111-51881-5-Chapter03-11.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈