📜  嵌入式系统寻址模式

📅  最后修改于: 2021-01-01 02:49:25             🧑  作者: Mango

8085单片机的寻址模式

寻址模式是用于与中央处理器(CPU)通信以执行任何特定任务的指令集。

通常,以下寻址模式用于在8085微控制器中执行指令:

  • 立即寻址模式
  • 索引寻址模式
  • 直接寻址模式
  • 注册直接寻址模式
  • 注册间接寻址模式

每种寻址模式的详细说明如下:

立即寻址模式

让我们从一个例子开始。

MOV A, #4AH 

简单来说,我们可以写

MOV A, #data

之所以称为立即数,是因为8位数据会立即发送到累加器(目标操作数)。

考虑下图描述了上述指令集及其执行。操作码74H保存在0202地址。数据4AH保存在程序存储器内的0203地址处。读取操作码74H之后,下一个存储器地址的数据将被复制到累加器A(E0H是累加器的地址)。由于一条指令为2字节,并且在一个周期内执行,因此程序计数器将增加2,并指向程序存储器的0204地址。

索引寻址模式

让我们考虑两个示例,以理解索引寻址模式的概念。请看以下说明:

MOVC A, @A+DPTR
MOVC A, @A+PC

这里PC是程序计数器,而DPTR是数据指针(均为16位寄存器)。考虑第一个例子。

MOVC A, @A+DPTR

在此,源操作数为@ A + DPTR。它具有该位置的源数据。在这里,DPTR的内容与累加器的当前内容相加。此添加项提供了一个新地址,即源数据的地址。该地址指向的数据将进一步传输到累加器。

考虑操作码为93H。值为01FE的DPTR,此处为01位于DPH侧(高8位),而FE位于DPL侧(低8位)。考虑累加器的值为02H。之后,完成16位加法,01FE H + 02H产生0200H。地址0200H上的数据将被传送到累加器。累加器的先前值(02H)将被来自0200H的新数据代替。图中突出显示了累加器内部的新数据。

直接寻址模式

直接寻址模式用于寻址操作数。在此,数据(源数据)的地址作为操作数存在。让我们考虑一个例子。

MOV A, 07H 

寄存器组#0(第7个寄存器)的地址为07H。当执行MOV指令时,寄存器07H中存储的数据将在累加器内部移动。由于寄存器07H保存数据1FH,因此1FH被移到累加器。

注意-我们没有在直接寻址模式中使用“#”,而是在立即寻址模式中使用了“#”,因为如果我们使用“#”,则数据值07H会传送到累加器而不是1FH。

现在,考虑下图。它显示了如何执行指令:

如上图所示,它是一个2字节指令,需要1个周期才能完成。

程序计数器将增加2,并将指向0204存储位置。一条指令MOV A的操作码为E5H。每当运行0202处的指令(E5H)时,累加器将变为活动状态并准备接收数据。然后,PC跳至0203处的下一个地址,并查找源数据(即传输到累加器)的位置04H的地址。在04H,控制器找到数据1FH并将其传送到累加器,从而完成了指令的执行。

注册直接寻址模式:

在寄存器直接寻址模式中,我们直接使用寄存器名称(作为源操作数)。

让我们考虑一个例子。

MOV A, R4 

一次,寄存器可以取R0至R7的值。微控制器中有32个这样的寄存器。为了仅使用这8个变量来使用这32个寄存器来寻址寄存器,使用了寄存器组。

一次只选择一个寄存器组。可以通过使用名为处理器状态字(PSW)的特殊功能寄存器(SFR)来选择寄存器组。 PSW是一个8位SFR,其中每个位都可以根据需要进行编程。从PSW.0到PSW.7分配位。

现在,考虑下图。它表示如何执行指令:

数据(2F)移动以粗体显示。 2F从数据存储位置0CH传输到累加器,并用虚线表示。 0CH是寄存器组#1的寄存器4的地址位置。上面显示的指令为1字节,需要1个周期才能完成执行。这意味着我们可以使用直接寻址模式来节省内存。

注册间接寻址模式

在寄存器间接寻址模式下,数据地址作为操作数存储在寄存器内。

MOV A, @R0 

在这里,R0内部的值将被视为地址,用于将要传输的数据保存在累加器内部。示例:如果寄存器R0的值为20H,并且数据2FH存储在20H的地址位置,则在执行上述指令后,2FH的值将被传送到累加器。

现在,考虑下图。它显示了如何执行指令:

考虑MOV A的操作码,@ R0为E6H。程序控制移至地址位置20H,在其中定位数据2FH,然后在累加器内部传输2FH。这是一个1字节的指令,程序计数器(PC)递增1并移至程序存储器的0203位置。

注意:仅寄存器R0和R1允许用作寄存器间接寻址指令。因此,程序员可以使用@ R0或@ R1开发一条指令。不允许使用其他所有注册银行。