寻址模式是大多数中央处理器 (CPU)设计中的指令集架构的一个方面。 在给定指令集架构中定义的各种寻址模式决定了该架构中的机器语言指令如何识别每个指令的操作数。寻址模式指定如何通过使用寄存器中保存的信息和/或机器指令中包含的常量或其他地方包含的常量来计算操作数的有效存储器地址。 —— 《维基百科》,词条翻译自英文,译者本人

简单来说寻址方式就是“CPU找数据/指令”的方式。

注意

各种寻址模式都没有一个被普遍接受的的名称。不同的作者和计算机制造商可以为相同的寻址模式赋予不同的名称,或者为不同的寻址模式赋予相同的名称。

常见寻址方式

指令的寻址方式

指令寻址的目的就是修改PC的值,因此下面的例子中

顺序寻址方式

没啥可说的,就是PC往下移:

1
PC = PC + 1

跳跃寻址方式

绝对跳跃寻址

即让PC跳跃到指定的地址处:

1
PC = some address
相对跳跃寻址

即让PC变化指定的offset,此处offset可正可负,即跳转可以往前也可以往后:

1
PC += offset

数据的寻址方式

数据的寻址方式较多,且很多寻址方式的名称因为没有统一规定而众说纷纭。

本文一方面按照考试的来1,另一方面尽量贴合wikipedia。

本文假设:

  • 寻址使用的输入为source_register(当输入是寄存器编号)
  • 寻址使用的输入为source_address(当输入是内存地址)
  • 寻址使用的输入为source(当输入是一个普通的数字)
  • 寻址出的“地址”称为target_address,常称为有效地址
  • 寻址出的“寄存器编号”称为target_register(立即数除外,立即数就是个数值)。

*的意义和C语言基本一样,即*(address)即取内存中address处的引用,*(register_id)代表取寄存器中的值。

隐含寻址

操作数是默认的,很多老的计算机在做运算的时候都是默认寻址累加器,例如:

1
2
3
4
; 想要实现 b += 3
mov target_register, b ; target = b
add 3 ; target_register += 3
mov target, target_register ; target = a

这里add 3中使用到的target_register就是隐含寻址。

立即寻址

这个是不是算寻址有一些争议,总的来说就是把数据直接塞在指令里。

直接寻址

1
target_address = source_address

间接寻址

1
target_address = *(source_address)

寄存器寻址

1
target_register = source_rigister

寄存器间接寻址

1
target_address = *(source_register)

偏移寻址

相对寻址
1
target_address = *(PC) + source
基址(加偏移量)寻址2
1
target_address = *(source_register) + source

其中source_register被称为基址寄存器,基址寄存器可以隐式地给出。

其实相对寻址就是隐含source_register为PC的基址寻址。

变址寻址
1
target_address =  source_address + *(source_register)

注意基址寻址和变址寻址的不同:

  • 基址(加偏移量)寻址是:确定不变的地址在source_register中,改变source来访问不同的地址
  • 变址寻址是:确定不变的地址在source_address中,改变source_register中的值来访问不同的地址

段寻址

段寻址是基址寻址的特例3

1
target_address = *(source_register) << 4 + source

这里的4是书中给的值,实际上要根据段的大小调整。

寻址方式的复合

比如,下面的寻址方式:

1
target_address = *(*(source_register) + source)

显然是基址寻址复合上间接寻址,那么这种寻址方式就称为“基址间接寻址”。

更多

还有很多其他的寻址方式,例如比例变址加偏移量、基址加变址加偏移量、基址加比例变址加偏移量、blablabla的东西。

不过这些寻址方式都是从上面几种方式变过去的,都大同小异。况且考试也不考,我就不写了,具体看维基吧(中文维基我还在翻译中……)。

1. 要活命的嘛……虽然书上不知所云
2. 教课书中称之为基址寻址,但维基和Pentium皆称之为基址+偏移量寻址,根据书中所述,Pentium将文中的间接寻址称为基址寻址。请再读一遍“注意”中的内容,并思考为什么考试考这个是一个坏主意。
3. 讲道理我觉得这算是“内存管理策略”而非寻址方式。