目录

单片机的七种寻址方式

1.直接寻址

2.寄存器寻址

3.寄存器间接寻址

4.立即数寻址

5.变址寻址

6.相对寻址

7.位寻址


指令系统

按所占字节分,分三种:
(1)单字节指令49条
(2)双字节指令45条;
(3)三字节指令17条
执行时间来分,分三种:
(1)1个机器周期 (12个时钟振荡周期)的指令64条:
(2)2个机器周期指令45条
(3)4个机器周期--乘、除指令

首先理解这样的等式

地址是20H的寄存器中,存放的内容是01H

(20H)=#01H

符号指令的书写格式

单个操作数的指令:

操作助记符 [目的操作数]

两个操作数的指令:

操作助记符[目的操作数],[源操作数]

描述符号

Rn(n=0~7)当前工作寄存器组中的寄存器R0~R7之一
Ri(i=0,1)当前工作寄存器组中的寄存器R0或R1
@间接寻址或编制寻址前缀
#data8位立即数
#data1616位立即数
direct片内RAM单元地址及SFR地址
addr1111位目的地址
addr1616位目的地址
rel8位地址偏移量,范围:-128~+127
bit片内RAM位地址,SFR的位地址
(X)X表示地址单元或寄存器的内容
/位操作数的取反操作前缀

单片机的七种寻址方式

1.直接寻址

单片机的直接寻址是指指令中给出操作数所在RAM单元的地址,操作数就在该地址中。直接寻址方式适用于内部RAM的低128B和特殊功能寄存器。例如,在一条指令中,操作码指明了要执行的操作,而地址字段指明了操作数所在的内存地址。这种方式下,CPU会直接从指定的内存地址中获取操作数进行运算或操作。

注:按字节访问特殊功能寄存器只能用直接寻址方式。在指令中,特殊化功能寄存器可以以单元地址的形式出现,也可以以特殊功能寄存器名的形式出现。

优点

直接寻址是一种简单直接地寻址方式,指令中包含了数据地内存地址,因此执行不需要额外地计算过程,节省了指令的存储空间。

缺点

指令寻址要求程序员必须清除的知道数据的内存地址,这在实际编程中会增加编程的复杂性,也降低了程序的灵活性和可移植性。

寻址空间

R0~R7、A、B和DPTR

例:若(50H)=#3AH,执行MOV A,50H后,(A)=

分析:地址为50H的存储单元,存的立即数是3AH,MOV A,50H的意思是将片内RAM中地址为50H存储单元中存储的存储数据进行移动,源操作数会覆盖目的操作数

所以累加器A的内容(A)=#3AH

这里解释一下单片机是如何存储MOV A,50H的,因为这条指令既有字母也有数字,单片机的ROM通过E5H和50H存储这条指令,E5H表示MOV,A后面跟的是寄存器,50H表示寄存器的地址。

注:指令中两个操作数都可由直接寻址方式给出:

MOV direct1 ,direct2

把片内RAM中62H单元的内容送到片内RAM中的42H单元中

2.寄存器寻址

寄存器寻址中,操作数直接从寄存器中读取或写入,在使用寄存器寻址时,指令中的操作数字段通常指示了要访问的寄存器的标识符,而实际的数据就存储在该寄存器中。例如,在一条指令中,操作码指明了执行的操作,而操作数字段指示了要从哪个寄存器中获取数据或向哪个寄存器中写入数据。

优点

寄存器是CPU中的高速寄存器,因此寄存器寻址速度非常快,提高了指令执行的效率,直接从寄存器中获取数据可以节省对内存的访问时间,避免了频繁读写内存的开销。

缺点

CPU内部的寄存器数量有限,对于复杂的计算或大规模数据处理,可能会导致寄存器资源不足的问题。

例:若(R0)=#30H,执行MOV A,R0后,(A)=

分析:寄存器R0中的数据为30H,将寄存器R0中的数据,覆盖A,所以(A)=#30H

这条指令只有字母,所以ROM通过只通过E8H存储这条指令即可

可以进行寄存器寻址:

工作寄存器R0-R7,累加器A,双字节AB,数据指针DPTR,位累加器Cy。

3.寄存器间接寻址

寄存器间接寻址就是指令中所给定的寄存器存放的不是操作数本身。而是操作数所在内RAM或外RAM单元的地址,即操作数通过寄存器间接获得。通俗来讲,CPU不直接使用指令中给出的地址,而是使用指令中指定的寄存器中存储的地址作为实际的内存地址。

优点

寄存器间接寻址允许程序员使用寄存器来存储内存地址,增加了程序的灵活性

同时,只需要修改寄存器中的地址,而不需要修改所有引用该地址的指令,使得程序的维护和修改更加容易。

缺点

使用寄存器间接寻址通常需要额外的指令来加载或存储寄存器的地址,这会增加一定的指令开销和执行时间。

寻址空间

片内RAM(@R0,@R1,@SP)

片外RAM(@R0,@R1,@DPTR)

为了区别寄存器寻址和寄存器间接寻址,在寄存器间接寻址方式中,应在寄存器名称前面加前缀标志“@”

例:若(R0)=#30H,(30H)=#5AH,执行MOV A,@R0后,(A)=

分析:寄存器R0中的数据是30H,存储单元30H的内容是5AH,根据描述符号,@为间接寻址或编制寻址前缀吗,@相当于取地址符,所以MOV A,@R0=MOV A,30H,所以是将30H中的内容覆盖A,所以(A)=#5AH

可用寄存器间接寻址:

R0,R1,数据指针DPTR,堆栈指针SP

4.立即数寻址

立即数寻址是直接将指令中的一个固定的数值(立即数)作为操作数,而不需要从内存或者寄存器中获取数据。在进行立即寻址时,指令本身包含了需要进行操作的数据,CPU会直接使用这些立即数进行计算或者存储。

优点

直接寻址是直接从指令中获取数据,无需额外的内存访问,能够节省内存访问的时间,同时简化了指令格式。

缺点

1.立即数通常需要在指令中编码,因此受到指令格式长度的限制,可能无法表示过大的操作数,造成操作数范围的限制。

2.对于大的立即数,需要占用更多的指令长度来进行编码,可能导致指令长度增加,降低了指令的密度,影响了指令的执行效率。

3.如果需要修改操作数的数值,通常需要修改程序的指令本身,而不是像寄存器或者内存那样可以动态改变数值。

寻址空间:程序寄存器中的立即数

为了与直接寻址指令中的直接地址加以区别,需在操作数前加前缀标志“#”

例:执行MOV A,#50H后,(A)=

分析:将立即数覆盖原来A中的数据,所以(A)=#50H

5.变址寻址

变址寻址是通过在执行指令时对一个基本地址进行偏移,以便访问存储器中的其他位置。在变址寻址中,除了使用指令中给出的基本地址外,还会使用一个称为变址寄存器(index register)的寄存器来存储偏移量。通过将基本地址与变址寄存器中的偏移量相加,可以计算出要访问的内存地址。

操作数的地址=基址(存在于DPTR或PC中)+偏移量(存在于累加器A中)

以两者内容相加形成的16位地址作为目的地址进行寻址

注:DPTR是一个16位的SFR,由两部分构成,高八位(DPH),低八位(DPL),例如2400H,那么24H就存储在DPH中,00H就存储在DPL中。

优点

对于需要顺序访问数组或其他数据结构中的元素的情况,变址寻址非常方便,能够通过基本地址和偏移量轻松地访问连续地内存单元。

缺点

1.使用变址寻址可能会增加程序的复杂性,特别是在涉及到多级变址的情况下,容易出错。

2.变址寻址需要使用一个或多个寄存器来存储变址值,这可能会限制可用的通用寄存器数量,从而影响程序的并行性和性能。

寻址空间:读程序存储器中的固定数据和程序散转

例:(A)=#0FH,(DPTR)=#2400H,执行MOVC A,@A+DPTR后,(A)=

分析:对A+DPTR进行取地址,A+DPTR=240FH,所以

MOVC A,@A+DPTR=MOVC A,240FH,将ROM中地址为240FH存储单元的内容复制并覆盖A中原先的内容

(A)=#88H

累加器中原来存储的数据是0FH,首先将DPTR内容与累加器的内容求和(240FH),接着单片机将程序存储器ROM中地址是240F存储单元的内容复制一份,覆盖原来ACC中的内容
本寻址方式的指令有3条:

MOVC A, @A+DPTR

MOVC A,@A+PC

JMP A,@A+DPTR

前两条指令适用于读程序存储器中固定的数据。第3条为散转指令,A中内容为程序运行后的动态结果,可根据A中不同内容,实现跳向不同程序入口的跳转。

6.相对寻址

指令给出的地址是相对于当前指令的地址的偏移量,而不是一个绝对的地址值。当CPU执行这样的指令时,会将当前指令的地址与给定的偏移量相加,以计算出实际的内存地址进行访问。

相对寻址通常用于实现跳转指令(如条件跳转、无条件跳转等)实现程序分支或者访存指令中。这种寻址方式使得程序可以更加灵活地进行控制流的改变,同时也可以简化程序的编写,因为不需要硬编码绝对的地址。

寻址空间:ROM

目的地址=转移指令所在的地址+转移指令字节数+rel

其中,偏移量rel是带符号8位二进制补码数:-128~+127。
程序转移范围是以转移指令的下条指令首地址为基准地址,相对偏移在-128~+127之间。
例如,2000H: SJMP 08H
该指令占据2个字节,转移偏移量为08,所以执行该程序PC地址为2000H,指令后,程序跳转到2000H+2H+08H=200AH

例如: SJMP LOOP
“LOOP”为目的地址标号。汇编时,由汇编程序自动计算和填入偏移量但手工汇编时,偏移量的值由手工计算。

7.位寻址

对位地址中的内容进行位操作的寻址方式称为位寻址。由于单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址,因此位寻址只能对有位地址的这两个空间进行寻址操作。

直接寻址和位寻址的区别:

直接寻址:

直接寻址,是把数据直接写入当前地址,或者把当前地址的内容读出如:MOV A,90H,就是把地址90H中的内容写入到寄存器A中。

位寻址:

对内部RAM和特殊功能寄存器具有位寻址功能的某位内容进行置1和清0操作。

位地址一般以直接位地址给出,位地址符号为“bit”,写入和读出的是一个位bit变量。如:

MOV C,7AH,就是把地址7AH中的内容写入位变量C,而内容只能是0、1。

MOV C,2FH.2,就是把地址2FH中的第2位的内容写入到C变量。内容只能是0、1。一个字节由8位组成。
例如:MOV A,00H和MOV C,00H,前者是将RAM中地址为00H的8位内容传递给A,后者是将位寻址区(20H-2FH)中的地址为00H的1位内容传递给C。这两个00H不是在同一个地址。

寻址空间:内RAM中位寻址区20H~2FH单元的128位(位地址为00H~7FH)以及11个特殊功能寄存器的83个可寻址位。

例:位地址00H内容为1,执行MOV C,00H后,PSW.7的内容为

注:PSW是一个8位的寄存器,PSW.7指的是PSW的最高位(从0开始),即CY,简称为C

分析:MOV C,00H的含义是把位地址为00H的内容放到PSW.7中,并且将PSW.7中原来的内容覆盖,(C)=1,PSW.7=1

对于8位的立即数用#表示,例如(40H)=#88H,对于1位的立即数,不用加#号,例,(C)=1

片内RAM中可以进行位寻址的地址

特殊功能寄存器(SFR)中能进行位寻址的地址

7种寻址方式的寻址空间总结:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐