📜  嵌入式系统-寻址模式

📅  最后修改于: 2021-01-07 05:49:17             🧑  作者: Mango


寻址模式是指您如何寻址给定的内存位置。执行此指令有五种不同的方式或五种寻址模式,如下所示:

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

立即寻址模式

让我们从一个例子开始。

MOV A, #6AH 

一般来说,我们可以写

MOV A, #data

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

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

立即寻址模式

-6AH之前的’#’符号表示操作数是一个数据(8位)。在没有“#”的情况下,将十六进制数作为地址。

直接寻址模式

这是寻址操作数的另一种方法。此处,数据(源数据)的地址作为操作数给出。让我们举个例子。

MOV A, 04H 

寄存器组#0(第4个寄存器)的地址为04H。当执行MOV指令时,寄存器04H中存储的数据将移至累加器。由于寄存器04H保留数据1FH,因此1FH被移至累加器。

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

现在,看下面的插图。它显示了指令如何执行。

直接寻址模式

如上图所示,这是一个2字节指令,需要1个周期才能完成。 PC将增加2并指向0204。指令MOV A的操作码地址为E5H。当执行0202处的指令(E5H)时,累加器被激活并准备接收数据。然后,PC转到下一个地址0203,并查找源数据(要传输到累加器)所在的04H位置的地址。在04H,控件找到数据1F并将其传输到累加器,因此执行完成。

注册直接寻址模式

在这种寻址模式下,我们直接使用寄存器名称(作为源操作数)。让我们尝试借助示例来理解。

MOV A, R4 

一次,寄存器可以取R0至R7的值。有32个这样的寄存器。为了使用仅有8个变量的32个寄存器来寻址寄存器,使用了寄存器组。有4个寄存器组,名称从0到3。每个存储区包括8个寄存器,名称从R0到R7。

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

现在,请看以下插图,以清楚地了解其工作原理。

注册直接寻址模式

操作码EC用于MOV A,R4。操作码存储在地址0202,执行时,控制直接进入相关寄存器组的R4(在PSW中选择)。如果选择了寄存器组#0,则来自寄存器组#0 R4的数据将被移至累加器。这里2F存储在04H。 04H代表寄存器组#0的R4地址。

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

注册间接寻址模式

在这种寻址模式下,数据的地址作为操作数存储在寄存器中。

MOV A, @R0 

在此,R0内的值被视为一个地址,该地址保存要传输到累加器的数据。示例:如果R0的值为20H,并且数据2FH存储在地址20H中,则在执行该指令后,值2FH将被传送到累加器。请参见下图。

注册间接寻址模式

因此, MOV A @ R0的操作码为E6H。假设选择了寄存器组#0,则寄存器组#0的R0保持数据20H。程序控制移至20H,在其中定位数据2FH,并将2FH传送到累加器。这是一条1字节的指令,程序计数器加1,然后移至程序存储器的0203。

–仅允许R0和R1形成寄存器间接寻址指令。换句话说,程序员可以使用@ R0或@ R1创建一条指令。允许所有注册银行。

索引寻址模式

我们将通过两个示例来理解索引寻址模式的概念。看看以下说明-

MOVC A,@ A + DPTR

MOVC A,@ A + PC

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

MOVC A, @A+DPTR

源操作数为@ A + DPTR。它包含此位置的源数据。在这里,我们将DPTR的内容与累加器的当前内容相加。此添加将提供一个新的地址,即源数据的地址。然后,该地址指向的数据将传输到累加器。

索引寻址模式

操作码为93H。 DPTR的值为01FE,其中01位于DPH(高8位)中,而FE位于DPL(低8位)中。累加器的值为02H。然后执行16位加法,01FE H + 02H产生0200H。地址0200H的数据将被传送到累加器。累加器(02H)中的先前值将被0200H中的新数据替换。图中突出显示了累加器中的新数据。

这是一条1字节的指令,需要执行2个周期,并且与以前的指令(每个都是1个周期)相比,该指令所需的执行时间高。

另一个示例MOVC A @ A + PC的工作方式与上述示例相同。此处不使用累加器添加DPTR,而是将程序计数器(PC)内的数据与累加器相加以获得目标地址。