第四章 指令系统
操作码:指明了“做什么”
地址码:指明了“对谁动手”
有的指令不需要地址码(停机)
指令格式
零地址指令
一地址指令
二地址指令
四次访存
三地址指令
四次访存
四地址指令
\[\begin{align}
&n位地址码的直接寻址范围=2^n\\
&若指令总长度固定不变,则地址码数量越多,寻址能力越弱
\end{align}
\]
指令按指令长度分类
定长操作码指令格式
可变长操作码指令格式
指令按操作类型分类
总结
扩展操作码指令格式
在设计扩展操作码指令格式时需注意:
(1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
三地址指令前缀不能为1111
(2)各指令的操作码一定不能重复
扩展操作码示例
\[\begin{align}
&设地址长度为n,上一层留出m种状态,下一层可扩展出m*2^n种状态\\
\end{align}
\]
优缺点
指令寻址
下一条欲执行指令的地址(始终由程序计数器PC给出)
顺序寻址
定长指令寻址
按字编址
按字节编址
变长指令寻址
跳跃寻址
由转移指令指出(JMP)
总结
数据寻址
增加寻址特征
直接寻址
指令字中的形式地址A就是操作数的真实地址EA,即EA=A
一次指令的执行访存2次:
(1)取指令访存1次
(2)执行指令访存1次
间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,EA=(A)
寄存器寻址
\[\begin{align}
&在指令字中直接给出操作数所在的寄存器编号,即EA=R_i,其操作数在由R_i所指的寄存器内\\
\end{align}
\]
寄存器间接寻址
\[\begin{align}
&寄存器R_i中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(R_i)\\
\end{align}
\]
隐含地址
不是显示的给出操作数的地址,而是在指令中隐含着操作数的地址
立即寻址
形式地址A就是操作数本身,又称立即数,一般采用补码形式
#表示立即寻址的特征
总结
偏移寻址
\[\begin{align}
&偏移寻址=\begin{cases}&基址寻址,EA=(BR)+A\\&变址寻址,EA=(IX)+A\\&相对寻址,EA=(PC)+A\\\end{cases}\\
&区别在于偏移的“起点”不一样\\
&BR-base\space address\space register\\
&EA-effective\space address\\
\end{align}
\]
基址寻址
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A
根据通用寄存器总数判断要用几个bit指明寄存器
基址寻址的作用
当程序从0地址开始存储,可以使用直接寻址
但通常程序在内存非0地址起始,直接寻址就无法奏效
可以采用基址寻址
采用基址寻址无需修改指令中的地址
变址寻址
基址寻址中,BR保持不变作为基地址,A作为偏移量
变址寻址的作用
当实现循环时采用直接寻址需使用十条加法指令
使用变址寻址更为合适
基址寻址变址寻址复合寻址
IX-Index Register
先使用基址寻址将指令位置定位到100的基地址
再使用变址寄存器实现循环的偏移量增加
相对寻址
相对寻址的作用
总结
硬件如何实现数的“比较”(扩展)
无条件转移指令JMP2不会管PSW的各种标志位,直接跳转到2
PSW也被称为标志寄存器