计算机体系结构基础知识介绍之内存寻址(二)

寻址方式是指指令用来指定要访问的对象(常量、寄存器或内存中的数据)的方式。当一个内存位置被使用时,寻址方式给出的实际内存地址叫做有效地址。立即数或字面量通常被认为是内存寻址方式(尽管它们访问的值是在指令流中),而寄存器通常被分开,因为它们通常没有内存地址。我们也把依赖于程序计数器的寻址方式,叫做PC相对寻址。PC相对寻址主要用于在控制转移指令中指定代码地址。

一、直接寻址

直接寻址是指在指令中操作数直接以单元地址的形式给出,也就是在这种寻址方式中,操作数项给出的是参加运算的操作数的地址,而不是操作数。例如:

```assembly
MOV A, 30H
```

这条指令中操作数就在30H单元中,也就是30H是操作数的地址,并非操作数。

直接寻址的优点是访问存储器次数较少,指令长度较短。缺点是操作数地址在指令中,灵活性较差,操作数的位数限制了寻址范围。

直接寻址与其他寻址方式的区别如下:

- 与立即寻址相比,直接寻址需要访问存储器一次才能获取操作数,而立即寻址不需要访问存储器,操作数就在指令中。但是立即寻址不能修改操作数,而直接寻址可以修改存储器中的数据。
- 与间接寻址相比,直接寻址只需要访问存储器一次就能获取有效地址,而间接寻址需要访问存储器或寄存器两次才能获取有效地址。但是间接寻址可以实现动态分配内存空间,而直接寻址不能。
- 与寄存器寻址相比,直接寻址需要访问存储器一次才能获取操作数,而寄存器寻址不需要访问存储器,操作数就在寄存器中。但是寄存器数量有限,而存储器空间较大。
- 与相对地址相比,直接寻址给出的是绝对地址,而相对地址给出的是相对于程序计数器PC的偏移量。相对地址可以有效缩短地址的长度,只与PC相对位置有关,与绝对地址无关。
- 与基址、变址、基址变址等复杂的存储器寻址方式相比,直接寻址没有使用基址、变址、位移等辅助计算有效地址的方法。复杂的存储器寻址方式可以实现数组、链表、栈等数据结构。

二、间接寻址

指令中的地址码字段给出的是操作数所在的存储单元或寄存器的地址。我们需要去这个单元或寄存器中取出操作数的有效地址,再去内存中寻找操作数。

举个例子,假设有一个指令如下:

```assembly
load R1, (R2)
```

这个指令的意思是将R2寄存器中的值作为一个地址,去内存中找到对应的数据,然后加载到R1寄存器中。这就是一个已存的寻址模式,也叫做寄存器间接寻址。

已存的寻址模式有一些变种,比如带有偏移量或索引的间接寻址。例如:

```assembly
load R1, 100(R2)
```

这个指令的意思是将R2寄存器中的值加上100作为一个地址,去内存中找到对应的数据,然后加载到R1寄存器中。这就是一个带有偏移量的间接寻址。

```assembly
load R1, (R2+R3)
```

这个指令的意思是将R2和R3寄存器中的值相加作为一个地址,去内存中找到对应的数据,然后加载到R1寄存器中。这就是一个带有索引的间接寻址。

该寻址模式相比于直接寻址或立即数寻址,有一些优缺点:

- 优点:可以扩大寻址范围,可以访问动态分配的内存空间,可以实现数组、链表、栈等数据结构。
- 缺点:需要多次访问内存或寄存器才能获取操作数,增加了访存时间和指令长度。

三、立即数寻址

立即数寻址是指在指令中操作数直接以数值的形式给出,也就是在这种寻址方式中,操作数项给出的是参加运算的操作数本身,而不是操作数的地址。例如:

```assembly
MOV AX, 251 ;将十进制数251送入寄存器AX,“251”是立即数
MOV AL, '5' ;将5的ASCII码送入寄存器AL,“'5'”是立即数
```

立即数寻址的优点是指令已经提供操作数,无需再次访问存储器,提供操作数最快。缺点是操作数为指令一部分,不能修改,适用于给某一寄存器或存储单元赋初值等操作。另外,指令中的操作数的位数限制了这类指令所表述的立即数的范围。

四、寄存器寻址

寄存器寻址是指在指令中操作数所需的数据存储在寄存器中,指令通过对寄存器的访问来获取这些数据。例如:

MOV AX, BX ;将寄存器BX的内容送入寄存器AX,“BX”是寄存器
MOV [1234H], AX ;将寄存器AX的内容送入内存地址1234H,“AX”是寄存器

寄存器寻址的优点是速度快,因为寄存器位于CPU内部,读取速度很快。缺点是寄存器数量有限,不能表示大范围的地址。

五、基址、变址等

基址寻址是指在指令中操作数的地址由基址寄存器的内容和形式地址相加得到。例如:

```assembly
MOV AX, [BX+1000H] ;将基址寄存器BX的内容加上1000H得到操作数的地址,再将该地址单元的内容送入寄存器AX
```

基址寻址的优点是可以扩大寻址范围,因为基址寄存器可以设置为较长的位数,从而可以在较大的存储空间中寻址。缺点是需要使用专门的基址寄存器,而且形式地址的位数受到限制。

变址寻址是指在指令中操作数的地址由变址寄存器的内容和形式地址相加得到。例如:

```assembly
MOV AX, [SI+1000H] ;将变址寄存器SI的内容加上1000H得到操作数的地址,再将该地址单元的内容送入寄存器AX
```

变址寻址的优点是可以实现程序块的规律变化,因为变址寄存器可以设置为自增或自减,从而使有效地址按变址寄存器的内容实现有规律的变化。缺点是需要使用专门的变址寄存器,而且形式地址的位数受到限制。

基址变址寻址是指在指令中操作数的地址由基址寄存器、变址寄存器和形式地址三者相加得到。例如:

```assembly
MOV AX, [BX+SI+1000H] ;将基址寄存器BX、变址寄存器SI和1000H三者相加得到操作数的地址,再将该地址单元的内容送入寄存器AX
```

基址变址寻址的优点是可以结合基址寻址和变址寻址的优势,实现更灵活和更大范围的寻址。缺点是需要使用两个专门的寄存器,而且形式地址、基址和变址三者的位数都受到限制。

以上三种复杂的寻址方式与其他简单的寻址方式(如立即、直接、间接、相对等)的区别如下:

- 以上三种复杂的寻址方式都需要通过加法运算来计算有效地址,而其他简单的寻址方式不需要或只需要一次加法运算。
- 以上三种复杂的寻址方式都需要使用专门或通用的寄存器来参与计算有效地址,而其他简单的寻址方式不需要或只需要使用一个通用或专用寄存器。
- 以上三种复杂的寻址方式都可以实现更灵活和更大范围的数据访问,而其他简单的寻址方式相对较为固定和有限。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D了一天bug忘了编译

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值