指令:操作码+地址码
指令分类:
按指令的地址码数量分类:零地址指令,一地址指令,二地址指令……
零地址指令:不需要操作数或操作数隐含在固定位置(如:栈顶和次栈顶)
一地址指令:每个数的加一减一,取反求补等。 ;或者需要两个操作数,但有一个隐含在某个寄存器中(如上图中的000100指令,只有b的地址,因为a已经在ACC中)
二地址指令:
三地址指令:
四地址指令:
按操作码长度分类:
指令字长:一条指令的长度(指令的长度可能不同)
半字长指令、单字长指令、双字长指令:指令字长的机器字长的多少倍
如:读取一条双字长指令需要两访存
定长指令字结构:指令系统中所有指令长度相等;变长~:~
定长操作码:指令系统中所有指令的操作码长度相同;可变~:~
按指令操作类型分类:
数据传送、运算类操作(算数逻辑操作、移位操作)、程序控制操作、输入输出操作
扩展操作码:定长指令字+可变长操作码
例:
设计扩展操作码需注意:短操作码不能是长操作码的前缀(否则会无法区别)
通常对使用频率高的指令分配较短的操作码,从而减少译码分析时间
例题:
指令寻址:如何确定下一条指令的地址?
PC:program counter 程序计数器,每读入一条指令自动加1(1指的是一条指令的指令字长),所以PC始终指向下一条指令
顺序寻址:
指令字长不变:
指令字长=存储字长=2B 指令字长=1/2存储字长=1B
指令字长可变:
跳跃寻址:
当读到3时,PC照常加一,此时PC=4,因为第4条指令为JMP 7:意为跳转到地址为7的指令,于是PC被改为7,下一条指令为7,当读取7时,PC在加1,PC=8
数据寻址:数据寻址有多种类型
直接寻址
指令字中的形式地址就是操作数的真实地址。即EA=A
间接寻址
寄存器寻址,寄存器间接寻址(寄存器昂贵,速度快,容量小)
隐含寻址:类比上面一地址指令中的隐含操作数
立即寻址:形式地址即是数据本身(用#作为该方式的寻址特征)
偏移寻址(某一段地址+ 偏移量A):基址寻址、变址寻址、相对寻址
基址寻址: R0指明将那个通用寄存器作为基址寄存器使用
基址寄存器中存放的是程序开始的地址,由操作系统存取,用户不能更改
变址寻址:物理结构与基址寻址一样,但变址寄存器面向用户,内容可由用户改变
变址寻址常用于循环程序:
相对寻址:
读取到M+3时,PC=M+4
堆栈寻址
硬堆栈:将一寄存器作为堆栈;软堆栈:将主存的一部分作为堆栈
有一指针指向栈顶(栈顶是会变的,指针始终指向栈顶)
Msp:SP指向的地址对应的数值
CISC和RISC:指令系统的两种设计方向
CSIC:复杂指令集/RISC:简单指令集:
用python类比:CSIC是包含许多库函数的python程序;RISC只有基本操作没有函数前者复杂后者简单