指令与数据的寻址方式
基本概念
存储器既可以存放数据,也可以存放指令
区分数据和指令
从时间来说
取指令事件发生在取指周期
取数据事件发生在执行周期
从空间来说
取出的代码是指令,一定送往指令寄存器(控制器
取出的代码是数据,一定送往数据寄存器(运算器
寻址方式
指令寻址方式(简单)
顺序寻址方式
跳跃寻址方式
数据(操作数)寻址方式(复杂)
立即寻址, 隐含寻址
直接寻址, 间接寻址
寄存器寻址, 寄存器间接寻址
偏移寻址
相对寻址
基址寻址
变址寻址
段寻址, 堆栈寻址
指令寻址
顺序指令寻址
通常执行程序时是一条指令接一条指令的顺序执行
从内存取出第一条指令,然后执行,然后取出第二条,然后执行,然后取出第三条,然后执行...
需要使用程序计数器PC(又称指令指针寄存器)存放下一条指令的地址 PC+1→PC

跳跃指令寻址
程序根据条件需要跳跃执行时采取跳跃寻址,即下一条指令的地址码不是由PC给出,而是由本条指令给出。即本条指令改变PC内数据(因为PC内是下一条指令地址),本条指令执行结束后会跳到PC指向的地址
跳跃后继续顺序执行指令,PC也要跟着改变 新地址→PC
使用跳跃可以实现程序分支与循环
操作数的寻址方式
形成操作数有效地址的方法:
单地址指令地址码的构成: Mode , D
实际有效地址为 E, 实际操作数 S
S= (E)

操作数隐含寻址
隐含寻址:在指令中不显示给出操作数。如某些单地址指令拥有隐含的操作数AC
操作数立即寻址
即指令的地址字段给出的不是操作数地址,而是操作数本身。准确来说根本没有寻址
S=D
例: MOV AX,38H (38H → AX)

这种指令执行速度快,不需要访存,取指的同时就取到了操作数
操作数直接寻址(Direct Addressing)
最“正常”的寻址方式。即指令的操作数字段内容为操作数的地址A,CPU去地址A取出数据D。可以表示为D = (A),和之前说的一样,括号可以视为C语言中对指针的解引用

操作数间接寻址(Indirect Addressing)
指令的操作数字段给出了地址A1,但是(A1)也是一个指针(地址),指向了另一个地址A2,即A2 = (A1),地址A2指向的才是数据D,即D = (A2) = ((A1))
因为地址A2可以有很多位,所以间接寻址可以扩大寻址范围

操作数寄存器寻址(Register Addressing)
指令中地址字段给出的不是内存地址而是CPU中通用寄存器的编号。假设编号为R,则数据D = (R)

操作数寄存器间接寻址
类似于间接寻址,寄存器R的内容A不是数据而是一个地址。操作数D = (A) = ((R))
D单元的内容是操作数的地址, D是操作数地址的地址
E=(R) inc [BX]

操作数偏移寻址
是直接寻址和寄存器间接寻址方式的结合
大致思想:目标地址EA = (R) + A,R是一个寄存器的编号,A是指令字中给出的一个偏移量(形式地址),是有符号数,即可以为负
分为三类:
相对寻址
即相对于当前PC的寻址。把PC的内容加上偏移量A
优点是程序员不需要使用绝对地址编程

基址寻址
CPU中的基址寄存器的内容加上偏移量A
优点是扩大寻址范围。基址寄存器的位数可以设置的很长
变址寻址
CPU中的变址寄存器的内容加上偏移量A
与基址寻址类似,但是变址寄存器的内容自动递增或递减
使用变址寻址的目的不在于扩大寻址空间,而是实现程序块的规律性变化

操作数段寻址
基于基址寻址。只是把地址空间划分为段
某计算机有20位地址。容量1MB。以64KB为单位划分为16段。则可以把20位地址划分为一个4位段号和一个16位段内偏移量。CPU内有一个段寄存器保存一个段号,计算地址时把段号左移16位再加上偏移量即可
堆栈寻址
使用栈,数据的存取只通过栈顶进行。后进先出 LIFO
可以分为:
硬件堆栈 (寄存器串联堆栈)
存储区域为若干个寄存器。CPU中有一组专门的串联堆栈寄存器,每个寄存器能保存一个字
入栈和出栈时栈顶不变,数据移动,即栈顶的地址为定值

优点:访问速度快
缺点:堆栈大小受限。数据的读出是破坏性的
软件堆栈 (存储器堆栈)
存储区域为主存的一部分。需要一个堆栈指示器来指示栈顶位置。CPU中有一个专用的寄存器作为堆栈指示器(SP: Stack Point)
栈顶变化时由SP指示而数据不动
优点:比串联堆栈灵活。长度几乎不受限。个数也不受限。对存储器寻址的指令对堆栈同样适用
压栈操作:

对应的表达式:(A) -> (SP), SP - 1 -> SP。此处使用的策略是栈顶指向空单元,即先压数据再移动指针,栈顶为空。当然也可以使栈顶指向满单元(略)
弹栈操作:

对应表达式:SP + 1 -> SP, (SP) -> A。在栈顶指向空单元策略下先移动指针再读取数据
不同寻址方式对比

基本寻址方式总结
令指令字中的地址字段为A,R为寄存器,SP为栈顶指针,EA为实际地址,操作数为D,D = (EA)
隐含寻址
默认操作数地址
不访存
数据范围受限
立即寻址
D = A
不访存
操作数值范围受限
直接寻址
EA = A
简单
地址范围受限
间接寻址
EA = (A)
地址范围大
多次访存
寄存器寻址
EA = R
不访存
地址范围受限
寄存器间接寻址
EA = (R)
地址范围大
访存
偏移寻址
EA = A + (R)
灵活
复杂
段寻址
EA = A + (R)
灵活
复杂
堆栈寻址
EA = SP(栈顶
不访存
应用受限
Last updated
Was this helpful?