774 字
4 分钟
寻址方式

寻址方式比较复杂的一般是cisc,risc指令集的运算指令一般要求源操作数在寄存器中或者是立刻数,目标操作数一般是寄存器,不会牵扯到隐式的load store操作

指令寻址#

  • 顺序执行 -> 顺序寻址
  • 分支、循环 -> 跳跃寻址

数据寻址#

Pasted image 20240804183158

  • 可以给操作数加上寻址特征位,此时操作数实际上是由寻址特征位加形式地址组成
  • 设计几类不同指令,不同的操作码之间采用不同的寻址方式,
  • 下列有效地址给出的是寄存器编号或者是内存地址
  • 对于操作数不来自于额外对内存寻址的寻址方式(立刻数寻址例外因为直接从指令中译码即可),寻址范围是X
  • 形式地址记作AA
  • 偏移寻址 即表格的后4种
说明有效地址EAEA寻址范围操作数
(获取操作数的额外)访存次数(不记获取指令的访存次数)
隐含寻址操作数来自事先约定寄存器如(ACC)+OP0 -> (ACC)事先约定X从事先约定的地方获取0
立刻数寻址形式地址即立刻数XXAA0
寄存器寻址形式地址是寄存器编号寄存器编号AAXR[A]R[A]0
直接寻址(绝对寻址)形式地址给出的是操作数所在的内存地址,A的位数限制了寻址范围AA[0,2w),where w=width of A[0, 2^w),where\space w = width\space of\space A(A)(A)1
间接寻址两次寻址得到真正的操作数,扩大了访存范围(A)(A)整个内存空间((A))((A))2
寄存器间接寻址形式地址是寄存器编号,把该寄存器的内容作为操作数的地址R[A]R[A]整个内存空间(R[A])(R[A])1
相对寻址相对于PC寄存器形成有效地址, PC指向的是下一条指令
其实我觉得这个不应该放到数据寻址,实际上就是跳跃寻址
PC+=SignExt(A)+1PC += SignExt(A) + 1,这里的1是一个指令宽度的意思,注意1[PC+12n,PC+1+2n),where n+1=width of A[PC + 1 -2^n, PC + 1 + 2^n),where\space n+1=width\space of\space A注意1XX
基址(加偏移量)寻址用于连续分配的多道程序设计,在某一道程序执行时BR基址寄存器不变,形式地址A发生变化(BR)+A(BR) + A((BR)+A)((BR) + A)1
变址寻址访问数组或者结构体采用,形式地址不变作为基地址,变址寄存器发生变化,比如每次加sizeof(Elem),这样就能访问数组的每一个元素(IX)+A(IX) + A,这里的I是index的意思((IX)+A)((IX) + A)1
堆栈寻址访问栈上的变量(SP)+A(SP) + A((SP)+A)((SP) + A)1
比例变址寻址

其他#

  • 注意有效地址与操作数的区别,让你给出有效地址别把操作数作为答案,给出操作数别把有效地址作为答案
  • 寻址方式的组合使用
    • 王道P173 05题