指令与数据的寻址方式

基本概念

存储器既可以存放数据,也可以存放指令

区分数据和指令

从时间来说

  • 取指令事件发生在取指周期

  • 取数据事件发生在执行周期

从空间来说

  • 取出的代码是指令,一定送往指令寄存器(控制器

  • 取出的代码是数据,一定送往数据寄存器(运算器

寻址方式

  • 指令寻址方式(简单)

    • 顺序寻址方式

    • 跳跃寻址方式

  • 数据(操作数)寻址方式(复杂)

    • 立即寻址, 隐含寻址

    • 直接寻址, 间接寻址

    • 寄存器寻址, 寄存器间接寻址

    • 偏移寻址

      • 相对寻址

      • 基址寻址

      • 变址寻址

    • 段寻址, 堆栈寻址

指令寻址

顺序指令寻址

通常执行程序时是一条指令接一条指令的顺序执行

从内存取出第一条指令,然后执行,然后取出第二条,然后执行,然后取出第三条,然后执行...

需要使用程序计数器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?