目录
寻址 是指按某种规则形成操作数的有效地址,我们把产生操作数有效地址的方式称为 寻址方式。
1. 操作数被包含在该指令之中,或存放在紧跟着指令的存储单元之中。
指令3:操作码占固定长度;对操作数的长度没有限制,我们根据操作码确定操作数的长度。
2. 操作数存放在 CPU 的某个寄存器之中。
以前的寄存器是用 D 触发器做的,现在一般是用高速内存(Cache)做的。
3. 操作数存放在主存中,指令应以某种方式给出主存单元的地址码。
4. 操作数存放在堆栈中,可以隐含约定由堆栈指针 SP 提供地址。
- 硬堆栈:由 SP 寄存器来提供栈顶地址。
- 软堆栈:由通用寄存器来提供栈顶地址。
堆栈在主存中;主存中划分有不同的存储空间。
5. 操作数存放在某个 I/O 接口的寄存器中。
接口控制器,简称接口,是系统总线与 I/O 总线通信的桥梁。简单来说,接口就是个协议转换单元,将系统的读写命令转换为 I/O 的收发命令。
因为机器指令的二进制码冗长,所以在汇编语言中,我们使用助记符号来描述机器指令。
根据地址码字段(给定条件 A 和形成方式 Mode)得到操作数或者得到操作数的有效地址 EA 。
由指令直接给出操作数。常用来提供常数、设置初值等。
① 定长格式
操作数在指令中的长度固定,从而其表示范围有限。
② 变长格式
操作数在指令之后,长度可变。
指令中直接给出操作数的有效地址,根据该地址从主存中读取或写入操作数。
① 定长格式
② 变长格式
应用举例:
操作数地址: EA = A
操作数: S = (A)
读取:A = 1002H S = 0020H
指令中直接给出寄存器号,操作数实际存储在指定编号的寄存器中。
操作数地址:EA = R
操作数:S = (R)
优点:比访问主存快;能有效地缩短指令长度。
应用举例:
指令中给出主存间址单元的地址 —— 操作数地址的地址。
优点:同一条指令通过不断修改间址单元的内容就能实现对不同操作数的访问。
应用举例:
A = 1002H
操作数地址:EA = (A) = 1020H
操作数:S = ((A)) = 8000H
指令中给出寄存器编号,指定的寄存器中存放的是操作数的有效地址。
优点:
注意:由于寄存器间接寻址仍然会访存,因此寻址速度不会提高。
应用举例:
操作数地址:EA = (R) = 1002H
操作数:S = ((R)) = 0020H
指令中给出寄存器编号,指定的寄存器的内容先减 1 ,再作为操作数的有效地址进行访存。
先 (R) = (R) - 1,后为操作数地址 EA 。
应用举例:
(R) = 1002H
操作数地址:(R) = 1002H - 1 = 1001H
操作数:S = (-(R)) = 0010H
指令中给出寄存器编号,寄存器的内容为操作数的有效地址,执行完访存后,寄存器的内容自动加 1 。
(R) 先作为操作数地址 EA,后 (R) = (R) + 1 。
应用举例:
操作数地址:EA = (R) = 1002H
操作数:S = ((R)) = 0020H
(R) = 1002H + 1 = 1003H
按照自底向上的生长方式,若向堆栈中压入数据,栈顶向上浮动;若从堆栈中弹出数据,栈顶向下浮动。改变操作码,就可以分别实现入栈和出栈的功能。
隐含约定寻址方式:
自底向上:
指令中分别给出一个寄存器编号和一个形式地址:
将基准地址和位移量相加得到操作数的有效地址。
(RX) 为位移量,D 为基准地址。
操作数地址:EA = (RX) + D
操作数:S = ((RX) + D)
缺点:D的位数有限, 若不能提供全字长地址码,会使访存空间受到限制。
指令中分别给出一个寄存器编号和一个形式地址:
将基准地址与位移量相加作为操作数的有效地址。
(RB) 为基准地址,D 为偏移量。
操作数地址:EA = (RB) + D
操作数:S = ((RB) + D)
优点:可由基址寄存器提供全字长地址码,再由指令给出一个位数较短的偏移量,两者配合足够覆盖主存的任何区域。
应用:程序的重定位
用户编程时使用的是一种与实际主存地址无关的逻辑地址,将来运行时再自动转换为操作系统分配给它的主存地址(物理地址),即程序重定位。
在实现程序重定位时由操作系统给用户程序分配一个基准地址,并将它装入基址寄存器,在执行程序时就可以自动映射成实际的主存地址。
变址寻址与基址寻址的区别:
- 变址: 面向用户,指令提供基准量,变址寄存器提供修改量(可变);适于处理一维数组。
- 基址: 面向系统,指令提供位移量,基址寄存器提供基准量(固定);用于扩大有限字长指令的访存空间和程序重定位。
指令中给出一个基址寄存器编号 RB、一个变址寄存器编号 RX 和一个形式地址 D:
操作数地址:EA = (RB) + (RX) + D
操作数:S = ((RB) + (RX) + D)
程序计数器 PC 当前的内容作为基准地址,指令中给出的形式地址作为位移量,两者相加后形成操作数的有效地址。位移量以补码的形式给出,可正可负,因此地址可以加也可以减。
操作数地址:EA = (PC) ± D
操作数:S = ((PC) ± D)
非相对寻址存在的缺点:
每次操作系统将程序加载到主存时,程序的起始地址(起始地址被送入到 PC 当中存放)一般不会和之前的起始地址一样。程序存放位置发生变化后,执行 JMP 2000 指令,我们仍会跳转到地址为 2000 的单元,将会导致错误结果。
转移地址按如下方式给出:
虽然程序的存放地址发生变化,但是由于相对距离没变,所以程序仍可正确执行。