计组-4.2指令的寻址方式
4.2 指令的寻址方式
指令寻址(先)
指令寻址:寻找 下一条 将要执行 ==指令== 的 ==指令地址==
程序总是根据 PC的内容 去主存取指令的。
- PC的位数 取决于存储器总字数 N,按字寻址时,位数 =log2N
- PC可表示的范围 N
每一条指令的执行都分为:==“取指令”==,“执行指令”两个阶段。
- ==PC+1是发生在 取指令 之后!==
顺序寻址:PC(程序计数器) ==+ “1”==(1指的是指令字长)【定长】
- 跳跃寻址:通过转移类指令实现。
数据寻址(后)
==数据寻址:寻找 本条指令 的地址码指明的 真实地址==
- ==数据寻址既是在找地址,也是在找操作数——找地址是手段,获取操作数是目的。==
方式:10种。故通常在指令字段中设置寻址特征字段来标记是哪种寻址方式。
==通用格式:| 操作码 | 寻址特征 | 形式地址A |== (为了简便此处都是用单地址而非多地址的形式)
- (操作码位数看有多少操作。寻址特征位数看有几种寻址方式)
形式地址==A==,有效(真实)地址==EA==(effective address)
(A)表示地址A的数值,A既可以是寄存器编号,也可以是内存地址。
直接寻址
- | LDA | 直接寻址特征 | A |
- 最直接的。操作数的真实地址就是形式地址 A 。即 EA = A
- 优缺:最简单,指令执行阶段只访存一次。A的位数限制了操作数的寻址范围,且操作数的地址不易更改。
- 适合:指令放置位置是 从内存0开始的?
间接寻址
- | OP | 间接寻址特征位 | A |
- 指令的字段给出的不是操作数真实地址,而是真实(有效)地址所在的主存单元的地址。 即 EA = (A)
- 优缺:可扩大寻址范围(EA可能存放的单元范围),且便于编制程序(多次间接 )。指令执行阶段要多次访存,慢。
寄存器寻址
| OP | 寻址特征 | Rī |
指令字段给出的是操作数所在的寄存器编号。 即 EA = Rī
优缺:指令执行阶段不用访存,访问寄存器,fast,且地址码位数更少,指令字长短。寄存器贵,数量有限。
寄存器间接寻址
- 间接寻址+寄存器寻址。 即 EA = (Rī)
- 优缺:相比于间接,减少了访存次数(only 1)。相比于寄存器,多了内存访存。
隐含寻址
- 不直接而是隐含 操作数的地址。(eg单地址的指令割术就隐含约定第二个操作数由累加器(ACC)提供)
- 优缺:利于缩短指令字长。需增加存储操作数或隐含地址的硬件。
立即(数)寻址
| OP | # | A |
指令字的地址字段给出的不是操作数的地址,而是操作数本身(也称立即数,补码形式出现)!(全过程只在取指令访存一次)
优缺:指令执行阶段不访存,fast。A的位数限制了立即数的范围。
偏移寻址
0.补充内容
- 以某个地址作为起点,另外一个作为偏移量
- ==补码:==
- 6位补码表示范围是-32~+31
- 补码扩充问题,因为数相加减时得同位数,正数前面添0,负数前面添1(FFF)
- Imm8 – 8位补码
- 标志寄存器:
- ZF:是否为零
- SF:结果的符号位
- OF:有符号数运算是否溢出
- CF:无符号数运算是否产生借位
- sizeof(double)=8
a.相对寻址
- 以**程序计数器PC ** ==所指的地址==作为“起点”
- EA = (PC) + A 。
- 【A是相对PC所指地址的偏移量,可正可负,补码表示】【寻址范围:2^A的位数】
- (ACC加法指令的地址码,可以采用“分段”的方式将程序段数据段分开,eg可解决M行的问题)
- 优 :便于程序的浮动(一段代码在程序中的浮动),用于转移指令。

b.基址寻址
以程序的起始存放地址作为“起点”
有效地址 = 形式地址 A + 基址寄存器BR(base address register)的内容 。 即 EA = (BR) + A。
其中BR既可以用专属寄存器,也可用某个通用寄存器
优缺:扩大寻址范围,便于程序“浮动”,实现多道程序并发运行。偏移量(形式地址A)的位数较短。
c.变址寻址
- 有效地址 = 形式地址A + 变址寄存器(IX)的内容。 即 EA = (IX) + A
- IX(index register)(作为偏移量)可以用专用的,也可以用通用的。形式地址A不变(作为基地址)
- 优缺: 扩大寻址范围,且适合编址循环程序。
- 基址寻址VS变址寻址
- 基址寻址面向操作系统,主要用于为多道程序或数据分配存储空间。
- BR的内容由OS确定且不可变,A可变。
- 变址寻址面向用户,主要用于处理数组问题。
- IX的内容由用户设定且可变,而指令字中的A是不可变的。
- 基址寻址面向操作系统,主要用于为多道程序或数据分配存储空间。
堆栈寻址
堆栈是主存(或寄存器)中一块特定的,按FILO原则管理的存储区
- 硬堆栈:寄存器堆栈
- 软堆栈:主存中划分出区域
操作数存放在堆栈中,隐含使用堆栈指针(SP,Stack Pointer)作为操作数地址

- 软堆栈
- 硬堆栈,速度快,成本高。
总结
| 寻址方式 | 有效地址 | (指令执行阶段)访存次数 |
|---|---|---|
| 直接寻址 | EA = A | 1 |
| 间接寻址(一次) | EA = (A) | 2 |
| 寄存器寻址 | EA = Ri | 0 |
| 寄存器间接寻址(一次) | EA = (RI) | 1 |
| 立即寻址 | A即是操作数 | 0 |
| 隐含寻址 | 程序指定 | 0 |
| 相对寻址(转移指令) | EA = (PC) + A | 1 |
| 基址寻址(多道程序) | EA = (BR) + A | 1 |
| 变址寻址(循环程序) | EA = (IX) + A | 1 |
| 堆栈寻址 | 入栈/出栈EA的确定方式不同 | 硬堆栈不访存,软堆栈访存1次 |
大题T 7-8留着有时间做
