?址模式
(Addressing modes)是
中央?理器
(CPU)??中,
指令集架?
的一部分。各?指令有不同的?址模式,?些?址模式?定此架?下的
机器?言
指令??的
運算數
。?址模式?通?
?存器
中的??或机器指令中的
常?
??算?算?的
???位址
。
在?算机程序??中,?址模式主要是
???言
使用者和
??器
??者需要關注的。?于一?相?的?念,???
正交指令集
,?涉及到任何指令使用任何?址模式的能力。
警告
[
??
]
注意,各??址模式都?有一?被普遍接受的的名?。不同的作者和?算机制造商可以?相同的?址模式?予不同的名?,或者?不同的?址模式?予相同的名?。
??“?址模式”本身也有不同的解?:可以解??“存?器地址?算方式”,也可以解??“操作???方式”。 在第一?解?下,不?存?器?取或?入存?器的指令(例如“?立??放入寄存器”)被???有“?址模式”。 第二?解?允??如VAX的机器使用立??模式位?允?寄存器或立??。 只有第一?解?适用于?如“加?有效地址”之?的指令。
下面列出的?址模式分?代??址和?据?址。 大多??算机?系??都保持????,但是存在一些允?在(?乎)任何上下文中使用任何?址模式使用的?系??。
下面的?明?粹具有代表性,以?明?址模式,?不一定反映任何特定?算机使用的助?符。
?址模式的?量
[
??
]
不同的?算机?系??在硬件中提供的?址模式?量上有?大差?。 消除???址模式??使用一?或??更??的?址模式有一些好?,?使?需要一些?外的指令,也??需要一??外的寄存器。 如果只有一些??的?址模式,那???管
流水?
CPU??得更???。
大多?RISC架?只有大?五???的?址模式,而DECCAX等CISC架?有十???址模式,其中一些非常??。 IBM System/360架?只有三??址模式,System/390又添加了一些。
?只有少??址模式?,所需的特定?址模式通常在指令代?中??(例如IBM System/360和后?者,?有大多?RISC)。 但是?存在?多?址模式?,通常在指令中留出特定字段?指定?址模式。 DEC VAX允??乎所有指令有多?存?器操作?,因此保留每?操作??明符的前?位以指示?特定操作?的?址模式。 保持?址模式指定符位?操作?操作位分??生正交指令集 。
?使在具有?多?址模式的?算机上,??程序的?量表明下面列出的???址模式占所有?址模式的?90%或更多。 由于大多?此??量基于??器?高??言生成的代?,因此?在某?程度上反映了所使用的??器的局限性。
?代?的?址模式
[
??
]
???址/直接?址
[
??
]
+----+------------------------------+
|jump| address |
+----+------------------------------+
(有效PC位址 = address)
???址指令的有效地址是地址??本身,无需修改。
PC相??址
[
??
]
+----+------------------------------+
|jump| offset | 相?跳?指令
+----+------------------------------+
(有效PC位址 = 下一條指令的位址 + offset,offset 可?負數)
PC??址的有效地址是下一?指令地址加上偏移??。 通常??偏移是有符??,以允?跳?到指令之前和之后的代?。
???址方式的跳?指令特?有用,因?常?的跳?指令的目?是是附近的指令(在高??言中,大多?
if
或
while
?句相?短)。 ??程序的?量表明,?于大?90%的?件跳?(大?±128或±512字?),8或10位偏移就足?了。
PC相??址的?一??点是代?可以是位置无?的 ,??可以加?到存?器中的任何地方而无需?整任何地址。
???址模式的某些版本可以是有?件的,?些?件例如??寄存器之?的?系:“如果reg1 = reg2跳?”、一?寄存器自身:“跳?除非reg1 = 0”或者?含地??寄存器中某些位。
寄存器?接?址
[
??
]
+-------+-----+
|jumpVia| reg |
+-------+-----+
(有效PC位址 = 'reg'中的?)
??据的?址模式
[
??
]
寄存器(直接)?址
[
??
]
+------+-----+-----+-----+
| mul | reg1| reg2| reg3| reg1 := reg2 * reg3;
+------+-----+-----+-----+
??“?址模式”?有有效地址,在某些?算机上不被??是?址模式。
在此示例中,所有操作?都在寄存器中,?果放在寄存器中。
基址加偏移量?址,及其??
[
??
]
有?被??“偏移?址”
+------+-----+-----+----------------+
| load | reg | base| offset | reg := RAM[base + offset]
+------+-----+-----+----------------+
(有效地址 = offset + base 寄存器的?容)
立??/字面量?址
[
??
]
+------+-----+-----+----------------+
| add | reg1| reg2| constant | reg1 := reg2 + constant;
+------+-----+-----+----------------+
??“?址模式”?有有效地址,?且在某些?算机上不被??是?址模式。
常量可以是有符?或无符?的。 例如,
move.l #$FEEDABBA, D0
?十六?制?“FEEDABBA”?移?到寄存器D0中。
操作?的?保存在指令本身中,而不是使用?存中的操作?。
?含?址
[
??
]
?含?址模式(在X86???言中也???式?址模式)未明?指定源和/或目?的有效地址。
操作??含源(如果有)或目的地有效地址(或有??者)。
?含的?址在??的?算机上?常?(直到20世?70年代中期)。 ??的?算机通常只有一?寄存器,可以在其中?行算?-累加器。 ??累加器机器?乎在每?指令中都?含地引用了累加器。 例如,操作
a:= b + c;
可以使用序列
load b; add c; store a;
“load”和“add”指令都?含目的寄存器(累加器); 每?“store”指令都?含了源寄存器(累加器)。
后?的?算机通常具有多?通用寄存器,??可以是算?的源寄存器和/或目的寄存器,因此后?的?算机需要一些其他?址模式?指定算?的源寄存器和目的寄存器。
參考資料
[
??
]