寻址方式
寻址方式(又称编址方式)指的是确定本条指令的数据地址及下一条要执行的指令地址的方法。
不同的计算机系统,使用数目和功能不同的寻址方式,其实现的复杂程度和运行性能各不相同。有的计算机寻址方式较少,而有些计算机采用多种寻址方式。通常需要在指令中为每一个操作数专设一个地址字段,用来表示数据的来源或去向的地址。在指令中给出的操作数(或指令)的地址被称为形式地址,使用形式地址信息并按一定的规则计算出来的一个数值才是数据(或指令)的实际地址。在指令的操作数地址字段,可能要指出:
① 运算器中的累加器的编号或专用寄存器名称(编号)
② 输入/输出指令中用到的 I/O 设备的入出端口地址
③ 内存储器的一个存储单元(或一 I/O设备 )的地址
有多种 基本寻址方式 和某些 符合寻址方式 ,简介如下
1、立即数寻址
所需的一个操作数在指令的地址字段部分直接给出。
则 Num 即为操作数的值。
适用于操作数固定的情况,提高了指令的执行速度,当该立即数的值限定为较小值(占用位数少)时,可在第一个指令字中直接给出,否则可在第二个指令字中给出。
2、直接寻址
在指令的地址码字段直接给出所需的操作数(或指令)在存储器中的地址。
则 Addr 为操作数在存储器中的地址。或转移指令等用到的指令地址。
例:Addr = 5718H ,这里的 H 表示 5718 是 16 进制的值,可能用作下一条指令的地址;也可能用作操作数的地址,若 [ 5718H ]= 3,即内存储器 5718 单元中的内容为 3, 则操作数就是这里的 3 。
3、寄存器寻址、寄存器间接寻址
计算机的CPU中一般设置有一定数量的通用寄存器,用于存放操作数、操作数地址或中间结果。假如指令地址码字段给出某一通用寄存器的编号(地址),且所需的操作数就在这一寄存器中,这就是寄存器寻址方式;若该寄存器中存放的是操作数在内存储器中所在单元的地址,这就是寄存器间接寻址方式。可通过指令的操作码或另设一个字段,来区分这两种不同的寻址方式。
例:RegNo.=5, 使用 5# 累加器 ,此时 5# 累加器中的内容为 7, 可记为 (R5)=7,对寄存器寻址方式,操作数就是这里的数值 7
对寄存器间接寻址,从内存 7# 单元读出来的数才是操作数
4、变址寻址
操作数的地址由指定的变址寄存器(由Reg指定)的内容和指令中的地址码(Disp)相加得到。
例:Disp=18H,Reg=5,(R5)=5700H
则操作数地址 = 5718H
便于对数组元素进行处理,是计算机中常用的一种寻址方式。
5、相对寻址
操作数(或指令)的地址由程序计数器 PC 的内容(即当前执行指令的地址)和指令的地址码相加得到。
例:Disp = 48H (PC) = 5600H
则实际地址 = 5648H
1).主要用于转移指令,对浮动程序很有用。
2).位移量可正可负,通常用补码表示。
6、基址寻址
在计算机中设置一个专用的基址寄存器,操作数(或指令)的地址通过基址寄存器的内容和指令中的地址码相加得到。
例:Disp= 18H,[BS]= 5700H
则操作数地址=5718H
主要用于为程序或数据分配存储区,对多道程序或浮动程序很有用,解决了程序在存储器中的定位和扩大寻址空间等问题。
7、间接寻址
指令的地址码字段给出的内容既不是操作数,也不是操作数的地址,而是操作数(或指令)地址的地址,这被称为间接寻址方式,多一次读内存储器的操作。
指令中的 Addr 可以用其他寻址方式给出,例如变址寻址,这就成为变址寻址与间接寻址的复合寻址方式。
8、堆栈寻址
堆栈是内存储器中一块按 “后进先出” 原则进行读写的存储区,并通过一个专用的寄存器(称为堆栈指针SP)给出堆栈的栈顶(和次栈顶)地址完成数据的读写操作,故不必在指令中用操作数地址字段给堆栈地址。通常在读写操作的前后伴随有计算机自动(不是用户通过指令)修改 SP 内容的动作,以确保按正确的 “后进先出” 原则读写堆栈区。
例如:(SP)- 1 → SP和AR,即SP的内容减 1 存回 SP,并送内存地址寄存器,接下来才可以把数据写到堆栈中。完成一次读堆栈操作后,要接着执行(SP)+ 1 → SP 的一次自动修改 SP 内容的操作。
需要注意的是,指令长度可能是一个字,也可能是两个字或多个字,要看操作数地址字段的位数要求,由具体的情况决定。
|