机器指令
一般格式如下:
操作码
- 长度固定:用于指令字长较长的情况 ,RISC(精简指令集)
- 长度可变:操作码分散在指令字的不同字段中
- 扩展操作码技术: 三地址指令操作码每减少一种
地址码
四地址
三地址
二地址
一地址
零地址
无地址码
指令字长
- 指令字长固定:有指令字长 = 存储字长(可以理解为一个内存单元长度)
- 指令字长可变:注意,变化的倍数也是字节的倍数。
我们还可以用一些硬件资源(主要是寄存器)代替指令字中的地址码字段,这样做可以:
- 可扩大指令的寻址范围
- 可缩短指令字长
- 可减少访存次数
操作和操作数
存放方式
对于一次能处理多个字节的CPU,必然存在着如何安排多个字节的问题,也就是大端和小端模式。以 int 类型的 0x12345678 为例,它占用 4 个字节,如果是小端模式(Little-endian),那么在内存中的分布情况为(假设从地址 0x 4000 开始存放):
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
如果是大端模式(Big-endian),那么分布情况正好相反:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
我们的 PC 机上使用的是 X86 结构的 CPU,它是小端模式;51 单片机是大端模式;很多 ARM、DSP 也是小端模式。
边界对准
边界未对准
寻址方式
指令寻址
- 顺序:PC + 1
- 跳跃:由转移指令指出
数据寻址
立即寻址:指令执行阶段不访存
直接寻址:内存中地址由 A 给出,执行阶段访问一次存储器,因为 A 写死了,操作数的地址不易修改
隐含寻址:操作数地址隐含在操作码或某个寄存器中(如8086中,乘法 MUL 隐含 DX 和 AX)
间接寻址:执行指令阶段 2 次访存,可扩大寻址范围,然后我们可以通过修改内存,然后修改操作数,便于编写程序。
寄存器寻址:第一,执行阶段不访存,只访问寄存器,执行速度快。其次,寄存器个数有限,可缩短指令字长。
寄存器间接寻址:便于编制循环程序
基址寻址,变址寻址:其实都差不多,只不过一个是基址寄存器,一个是变址寄存器。
相对寻址:
堆栈寻址:进桟 (SP)-1→SP
,出栈 (SP)+1→SP
指令格式
考虑因素
- 指令条统的兼容性(与以前的指令兼容)
- 操作类型,数据类型,指令格式,寻址方式,寄存器个数
举例
略
RISC 精简指令集计算机
- RISC(Reduced Instruction Set Computer)
- CISC(Complex Instruction Set Computer)
特征
- 选用使用频度较高的一些简单指令, 复杂指令的功能由简单指令来组合
- 长度固定、指令格式种类少、寻址方式少
- 只有 LOAD / STORE 指令访存
- 采用流水技术一个时钟周期内完成一条指令
- 采用组合逻辑实现控制器(即使用硬件,而非微程序存储)
比较
- RISC更能充分利用 VLSI 芯片(超大规模集成电路)的面积
- RISC 更能提高计算机运算速度指令数、指令格式、寻址方式少, 通用寄存器多,采用组合逻辑,便于实现指令流水
- RISC 便于设计,可降低成本,提高可靠性
- RISC 有利于编译程序代码优化
- RISC 不易实现指令系统兼容(比较难增加指令)