目录
单片机的七种寻址方式
1.直接寻址
2.寄存器寻址
3.寄存器间接寻址
4.立即寻址
5.变址寻址
6.相对寻址
7.位寻址
首先理解这样的等式
地址是20H的寄存器中,存放的内容是01H
(20H)=#01H
符号指令的书写格式
单个操作数的指令:
操作助记符 [目的操作数]
两个操作数的指令:
操作助记符[目的操作数],[源操作数]
描述符号
Rn(n=0~7) | 当前工作寄存器组中的寄存器R0~R7之一 |
Ri(i=0,1) | 当前工作寄存器组中的寄存器R0或R1 |
@ | 间接寻址或编制寻址前缀 |
#data | 8位立即数 |
#data16 | 16位立即数 |
direct | 片内RAM单元地址及SFR地址 |
addr11 | 11位目的地址 |
addr16 | 16位目的地址 |
rel | 8位地址偏移量,范围:-128~+127 |
bit | 片内RAM位地址,SFR的位地址 |
(X) | X表示地质单元或寄存器的内容 |
/ | 位操作数的取反操作前缀 |
单片机的直接寻址是指指令中给出操作数的地址,操作数就在该地址中。例如,在一条指令中,操作码指明了要执行的操作,而地址字段指明了操作数所在的内存地址。这种方式下,CPU会直接从指定的内存地址中获取操作数进行运算或操作。
优点
直接寻址是一种简单直接地寻址方式,指令中包含了数据地内存地址,因此执行不需要额外地计算过程,节省了指令的存储空间。
缺点
指令寻址要求程序员必须清除的知道数据的内存地址,这在实际编程中会增加编程的复杂性,也降低了程序的灵活性和可移植性。
寻址空间
片内RAM低128字节,SFR(符号形式)
例:若(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表示寄存器的地址。
寄存器寻址中,操作数直接从寄存器中读取或写入,在使用寄存器寻址时,指令中的操作数字段通常指示了要访问的寄存器的标识符,而实际的数据就存储在该寄存器中。例如,在一条指令中,操作码指明了执行的操作,而操作数字段指示了要从哪个寄存器中获取数据或向哪个寄存器中写入数据。
优点
寄存器是CPU中的高速寄存器,因此寄存器寻址速度非常快,提高了指令执行的效率,直接从寄存器中获取数据可以节省对内存的访问时间,避免了频繁读写内存的开销。
缺点
CPU内部的寄存器数量有限,对于复杂的计算或大规模数据处理,可能会导致寄存器资源不足的问题。
寻址空间
R0~R7、A、B和DPTR
例:若(R0)=#30H,执行MOV A,R0后,(A)=
分析:寄存器R0中的数据为30H,将寄存器R0中的数据,覆盖A,所以(A)=#30H
这条指令只有字母,所以ROM通过只通过E8H存储这条指令即可
寄存器间接寻址是一种机器指令寻址方式,其含义是使用一个寄存器中的内容作为内存地址,以访问内存中的数据。在进行寄存器间接寻址时,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
立即寻址是直接将指令中的一个固定的数值(立即数)作为操作数,而不需要从内存或者寄存器中获取数据。在进行立即寻址时,指令本身包含了需要进行操作的数据,CPU会直接使用这些立即数进行计算或者存储。
优点
直接寻址是直接从指令中获取数据,无需额外的内存访问,能够节省内存访问的时间,同时简化了指令格式。
缺点
1.立即数通常需要在指令中编码,因此受到指令格式长度的限制,可能无法表示过大的操作数,造成操作数范围的限制。
2.对于大的立即数,需要占用更多的指令长度来进行编码,可能导致指令长度增加,降低了指令的密度,影响了指令的执行效率。
3.如果需要修改操作数的数值,通常需要修改程序的指令本身,而不是像寄存器或者内存那样可以动态改变数值。
寻址空间:ROM
例:执行MOV A,#50H后,(A)=
分析:将立即数覆盖原来A中的数据,所以(A)=#50H
变址寻址是通过在执行指令时对一个基本地址进行偏移,以便访问存储器中的其他位置。在变址寻址中,除了使用指令中给出的基本地址外,还会使用一个称为变址寄存器(index register)的寄存器来存储偏移量。通过将基本地址与变址寄存器中的偏移量相加,可以计算出要访问的内存地址。
操作数的地址=基址(存在于DPTR或PC中)+偏移量(存在于A中)
注:DPTR是一个16位的SFR,由两部分构成,高八位(DPH),低八位(DPL),例如2400H,那么24H就存储在DPH中,00H就存储在DPL中。
优点
对于需要顺序访问数组或其他数据结构中的元素的情况,变址寻址非常方便,能够通过基本地址和偏移量轻松地访问连续地内存单元。
缺点
1.使用变址寻址可能会增加程序的复杂性,特别是在涉及到多级变址的情况下,容易出错。
2.变址寻址需要使用一个或多个寄存器来存储变址值,这可能会限制可用的通用寄存器数量,从而影响程序的并行性和性能。
寻址空间:ROM
例:(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中的内容
指令给出的地址是相对于当前指令的地址的偏移量,而不是一个绝对的地址值。当CPU执行这样的指令时,会将当前指令的地址与给定的偏移量相加,以计算出实际的内存地址进行访问。
相对寻址通常用于实现跳转指令(如条件跳转、无条件跳转等)实现程序分支或者访存指令中。这种寻址方式使得程序可以更加灵活地进行控制流的改变,同时也可以简化程序的编写,因为不需要硬编码绝对的地址。
寻址空间:ROM
对位地址中的内容进行位操作的寻址方式称为位寻址。由于单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址,因此位寻址只能对有位地址的这两个空间进行寻址操作。
直接寻址和位寻址的区别:
直接寻址:
直接寻址,是把数据直接写入当前地址,或者把当前地址的内容读出如:MOV A,90H,就是把地址90H中的内容写入到寄存器A中。
位寻址:
位寻址是位操作命令,写入和读出的是一个位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位空间,SFR位空间
例:位地址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