机器指令
概述
机器指令:机器能够识别并执行的命令
指令字:代表指令的一组二进制代码信息
指令字长:指令字中二进制代码的位数
指令集:一台计算机中的所有机器指令的集合
指令系统的研究主要包括数据表示、寻址方式和指令三方面的内容
指令系统应该满足的要求:
- 完备性:指令齐全,编程方便
- 高效性:占内存少,运行速度快
- 规整性:指令与运算规则统一
- 兼容性:向上兼容
对计算机系统来说:
- 指令是程序设计的最小单位
- 指令是硬件设计的依据
- 指令是软件和硬件的接口
机器指令
指令的一般格式
形如
操作码字段 | 地址码字段 |
---|---|
操作码
操作码反映了机器做什么操作
- 长度固定:用于指令字长较长的情况
- 长度可变:操作码分散在指令字的不同字段中
地址码
地址码用来指出操作数的地址(源操作数、目的操作数、下一条指令的地址)
设指令字长32位,操作码固定8位
四地址
OP | $A_1$ | $A_2$ | $A_3$ | $A_4$ |
---|---|---|---|---|
$A_{1-4}$ 每个占6字节
$A_1$第一操作数地址
$A_2$第二操作数地址
$A_3$结果地址
$A_4$下一条指令的地址
$(A_1)OP(A_2)\rightarrow A_3$
四次访存,寻址范围$2^6=64$
三地址
用PC去代替四地址的$A_4$
OP | $A_1$ | $A_2$ | $A_3$ |
---|---|---|---|
$A_{1-3}$ 每个占8字节
$A_1$第一操作数地址
$A_2$第二操作数地址
$A_3$结果地址
$(A_1)OP(A_2)\rightarrow A_3$
还是四次访存,但是寻址范围变成$2^8=256$
二地址
把$A_3$用$A_1$或者$A_2$代替
OP | $A_1$ | $A_2$ |
---|---|---|
$A_1,A_2$每个占12字节
$(A_1)OP(A_2)\rightarrow A_1$ 或者 $(A_1)OP(A_2)\rightarrow A_2$
仍然是4次访存,寻址范围是$2^12=4K$
如果把结果存入ACC(累加器),则变成3次访存
一地址
OP | $A_1$ |
---|---|
$A_1$占24位
$(ACC)OP(A_1)\rightarrow ACC$
2次访存,寻址范围是$2^24=16M$
零地址
即没有地址码的意思
指令字长
指令字长决定于:
操作码的长度
操作数地址的长度
操作数地址的个数
指令字长固定
指令字长=存储字长=机器字长
指令字长可变
按字节的倍数变化
操作数类型和操作种类
操作数类型
地址 | 无符号整数 |
---|---|
数字 | 定点数、浮点数、十进制数 |
字符 | ASCII码 |
逻辑数 | 逻辑运算 |
数据在存储器中的存放方式
下图
操作类型
数据传送
算数逻辑操作
移位操作
算数移位
逻辑移位
循环移位(带进位和不带进位)
转移
无条件转移 JMP
条件转移
- 结果为零转 JZ (Z=1)
- 结果溢出转 JO(O=1)
- 结果有进位转 JC(C=1)
- 跳过一条指令 SKP
调用和返回
陷阱(Trap)与陷阱指令
意外事故中断
一般是不给用户直接使用的,出现事故的时候由CPU自动产生并执行
输入输出
寻址方式
寻址方式的定义
确定本条指令的操作数地址和下一条欲执行指令的指令地址
寻址方式分为
- 指令寻址
- 数据寻址
指令寻址
顺序寻址 $(PC)+1 \rightarrow PC$
跳跃 由转移指令指出,见下图
数据寻址
操作码 | 寻址特征 | 形式地址A |
---|---|---|
形式地址 指令字中的地址
有效地址 操作数的真实地址
约定 指令字长=存储字长=机器字长
立即寻址
形式地址A就是操作数
OP | # | A |
---|---|---|
指令执行阶段不访存
A的位数限制了立即数的范围
直接寻址
EA=A 有效地址由形式地址直接给出
- 执行阶段访问一次存储器
- A的位数决定了该指令操作数的寻址范围
- 操作数的地址不易修改(必须修改A才能修改)
隐含寻址
操作数地址隐含在操作码中
指令字中少了一个地址字段,可以缩短指令字长
间接寻址
EA=(A) 有效地址由形式地址间接提供
寄存器寻址
EA=$R_i$
有效地址即寄存器编号
基址寻址
采用专用寄存器作基址寄存器
EA=(BR)+A BR为基址寄存器
采用通用寄存器作基址寄存器
逻辑地址和物理地址
变址寻址
相对寻址
堆栈寻址
软件堆栈的三个优点
可以有较大的深度
可以设置多个堆栈
除了专门的堆栈指令PUSH和POP,还可以用任何访问主存的指令来访问堆栈中的数据