【计算机组成原理】指令系统(三)—— 指令寻址与数据寻址
一、指令寻址
指令寻址:下一条欲执行指令的地址(始终由程序计数器PC给出)。
指令寻址最主要的就是确定 PC 的值,其在不同的情况下的计算是不同的,不能仅仅使用 PC = ( PC ) + 1
计算。根据编址方式的不同或者指令长度的不同,可能是加2也可能直接赋一个值。
顺序寻址
PC = ( PC ) + 1
的情况
PC = ( PC ) + 2
的情况
PC = ( PC ) + n
的情况
采用变长指令字结构时,读入一个字,根据操作码判断这条指令的总字节数 n,修改PC的值。
跳跃寻址
跳跃寻址: 由转移指令指出 PC 的值
分析:执行完序号3的指令时,此时 PC 的值为4,指向图中蓝色方框的指令。但是使用 转移指令JMP 后,PC 的值变为 7, 指向的指令为序号为7的指令:‘LDA 1100’
指令寻址总结
二、数据寻址
数据寻址:确定 本条指令的地址码指明的真实地址。
数据寻址有如上图所示方式,为了标识数据寻址的方式,在指令结构中增加了 寻址方式位
这一字段。
(一)、六种简单寻址
1. 隐含寻址
隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址 。
优点:有利于缩短指令字长。
缺点:需增加存储操作数或隐含地址的硬件。
2. 立即寻址
立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式。
一条指令的执行:取指令 访存1次;执行指令 访存0次;暂不考虑存结果共访存1次。
优点:指令执行阶段不访问主存,指令执行时间最短。
缺点:A 的位数限制了立即数的范围。如 A 的位数为 n,且立即数采用补码时,可表示的数据范围为
−
2
n
−
1
~
2
n
−
1
−
1
-2^{n-1}~2^{n-1}-1
−2n−1~2n−1−1.
3. 直接寻址
直接寻址:指令字中的形式地址A就是操作数的真实地址 EA,即EA=A 。
一条指令的执行:取指令 访存1次, 执行指令 访存1次 ,暂不考虑存结果共访存2次。
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。
4. 间接寻址
间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即 EA=(A) 。
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。
5. 寄存器寻址
寄存器寻址:在指令字中直接给出操作数所在的寄存器编号
,即 EA =
R
i
R_i
Ri ,其操作数在由
R
i
R_i
Ri 所指的寄存器内。
一条指令的执行:取指令 访存1次;执行指令 访存0次;暂不考虑存结果共访存1次。
优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。
缺点:寄存器价格昂贵,计算机中寄存器个数有限 。
6.寄存器间接寻址
寄存器间接寻址:寄存器 R i R_i Ri 中给出的不是一个操作数,而是操作数所在主存单元的地址,即 EA = ( R i R_i Ri) 。
一条指令的执行:取指令 访存1次;执行指令 访存1次;暂不考虑存结果共访存2次。
特点:与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
(二)、偏移寻址
- 相对寻址:以程序计数器PC所指地址作为“起点”。 EA = (PC)+A
- 基址寻址:以程序的起始存放地址作为“起点”。 EA = (BR)+A
- 变址寻址:程序员自己决定从哪里作为“起点”。 EA = (IX)+A
7. 相对寻址(PC)
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即 EA=(PC)+A,其中 A是相对于PC所指地址的位移量,可正可负,补码表示 。
- 相对寻址的作用
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)。
相对寻址广泛应用于转移指令。
8. 基址寻址(BR —— base address register)
基址寻址:将**CPU中基址寄存器(BR)**的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即 EA= (BR)+A。
注:“重定位寄存器”就是“基址寄存器”
- 采用专用寄存器和采用通用寄存器两种方式作为基址寄存器。
- 采用通用寄存器作为基址寄存器时,在指令中指明,要将哪个通用寄存器作为基址寄存器使用。
注:
(1)基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
(2)当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
- 基址寻址的作用
程序运行前,CPU将BR的值修改为该程序的起始地址(存在操作系统PCB中)
优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,便于程序“浮动”。采用基址寻址无需修改指令中的地址码。
9. 变址寻址(IX — index register)
变址寻址:有效地址EA 等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即 EA= (IX)+A,其中 IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器 。
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址) 。
优点:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。
(三)、特殊寻址方式
10. 堆栈寻址
堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。 【SP — Stack Pointer】
堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)”
原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
以上述堆栈形式实现一次加法操作。记栈顶单元为Msp
步骤一:POP ACC 取栈顶元素到 ACC寄存器
(Msp) → ACC
(SP)+1 → SP
步骤二:POP X 取栈顶元素到 X寄存器
(Msp) → X
(SP)+1 → SP
步骤三:ADD Y
(ACC)+(X) → Y
步骤四:PUSH Y
(SP)-1 → SP
(Y) → Msp
硬堆栈与软堆栈
硬堆栈:寄存器堆栈。
软堆栈:从主存中划出一段区域来做堆栈。
(四)、数据寻址总结
注意:取出当前指令后, PC会指向下一条指令,相对寻址是相对于下一条指令的偏移。
三、CISC 和 RISC
CISC: Complex Instruction Set Computer
设计思路:一条指令完成一个复杂的基本功能。
代表:x86架构,主要用于笔记本、台式机等。
RISC: Reduced Instruction Set Computer
设计思路:一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基本功能。
代表:ARM架构,主要用于手机、平板等。
比如设计一套能实现整数、矩阵加/减/乘运算的指令集:
CISC的思路:除了提供整数的加减乘指令除之外,还提供矩阵的加法指令、矩阵的减法指令、矩阵的乘法指令。
一条指令可以由一个专门的电路完成,有的复杂指令用纯硬件实现很困难 → 采用“存储程序”的设计思想,由一个比较通用的电路配合存储部件完成一条指令
RISC的思路:只提供整数的加减乘指令
一条指令一个电路,电路设计相对简单,功耗更低,“并行”、“流水线”
CISC和RISC的对比
注:乘法指令可以访存,一定是 CISC