本章重点是掌握拓展操作码的方法和寻址方式及其对应的名称。
指令格式
操作码 + 地址码
定长:指令系统中所有指令的二进制位数相同
变长:可以不同
地址码
单地址、双地址、三地址、零地址等。
零地址是事先约定好的地址,如栈顶、次栈顶、累加器等。
随着地址段位数增长,会导致指令过长,且会导致程序设计的灵活性变差。
操作码
规整型
操作码长度固定,指令码长度可变。
非规整型
操作码长度不固定,指令码长度固定。
指令码长度固定,因此若要增长操作码,就需要缩短地址码。
在拓展操作码时,长码的开始部分不能和短码相同。
可以看到,拓展时,高位都是1111,而短码高位不存在1111的编码。
分配操作码时,如果找不到思路,可以把所有排列组合列出来再考虑。
指令类型
数据传送类
- 一般传送指令:复制到目的地址,MOV、LOAD、STORE
- 堆栈操作指令:PUSH、POP
- 数据交换指令:XCHG
运算类
程序控制类
中断隐指令不能归属于程序控制类指令。
转子指令(转向子程序)需要子程序地址,转子前需将当前PC值压入堆栈。子程序返回和中断返回都是零地址指令,地址由SP给出。
输入输出类
若I/O设备与内存独立编址,则需要单独设置访存和访I/O命令。
寻址技术
指令寻址
通常采用顺序寻址或跳跃寻址。
数据寻址(重点)
从形式地址获取有效地址。
- 立即寻址:地址字段直接存放操作数;
- 直接寻址:形式地址就是有效地址;
- 间接寻址:形式地址是有效地址的地址,可以形成多级间接寻址;
- 寄存器寻址:操作数在某一CPU的通用寄存器中;
- 寄存器间接寻址:有效地址在某一CPU的通用寄存器中,可缩短形式地址;
- 隐含寻址:指令操作码隐含操作数地址(如约定使用某一寄存器);
- 变址寻址:有效地址=变址寄存器内容Rx+形式地址(偏移量),适用于操作数据块;
变化的是变址寄存器Rx的内容,可由用户修改。 - 基址寻址:有效地址=基址寄存器内容+形式地址(位移量);
变化的是形式地址内容,基址寄存器的内容是固定的。 - 相对寻址:PC+偏移量,指出操作数和现行指令间的相对位置;
- 页面寻址:将主存空间分页,指令中只给出业内地址;
零页寻址即在第零页寻址;
当前页寻址即在PC所在页面寻址;
页寄存器寻址则表示页号在页寄存器中,与形式地址拼接形成有效地址。 - 其它寻址:位寻址(寻址到位),块寻址(对连续的块进行寻址),堆栈寻址(由堆栈指针SP隐含制定)。
变型或组合寻址方式
- 自增自减寄存器间址:确定有效地址后,递增或递减寄存器内容。
- 拓展变址方式:
- 基址变址寻址:
堆栈
寄存器堆栈(硬堆栈)
无需栈顶指针。
软堆栈
SP指向栈顶。
RISC特点
- 指令长度固定!
- 基本思想就是精简、高使用频率!精简不是简陋,并不是回到CISC前的水平。
.
.
.
.
.
部分图片来自马永强老师的PPT。