操作码、操作数、寻址方式
# Lecture14 - 指令系统
对应教材
# 指令
# 指令要素
# 指令表示
如何避免指令的二义性?
# 例子:Y = (A - B) / (C + D * E ) 三 / 两 / 单 / 零地址指令分别是怎么操作的?
三地址:占用更多的指令操作数,但是不需要覆盖
双地址:有一个地址必须承担双重任务,需要先做一次 “move” 操作
单地址:第二个地址是隐含的,其隐含地址被称为 “累加器”(Accumulator, AC)
零地址:空指令、停机指令、中断指令
# 指令格式:扩展操作码
# 例题:如何计算零地址、一地址、二地址指令条数?
第一问
16 - 6 - 6 = 4
2 4 = 16
16 - M - N
第二问(关键是,需要留出至少 1 位标志是零地址或一地址)
0000-1110
第三问
设一地址指令最多由 R 种
Q = [(2 4 - P) * 2 6 - R]* 2 6
详细解答:https://blog.csdn.net/KK_2018/article/details/110918609
# 指令格式
# 操作码
# 差异与共性
# 操作码:数据传送
# 操作码:算数运算
# 操作码:逻辑运算
区分逻辑移位和算术移位
特别关注一下算数左移
# 操作码:输入输出
# 操作码:控制转移
# 分支指令 Branch Jump
BR 无条件跳转
BRE R1 R2 X 判断是否相等
BRZ 211 如果是 0,那么跳转到 211 的位置
BRE R1 R2 235 如果 R1 = R2,那么跳转到 235 的位置
# 跳步指令 Step
ISZ increment-and-skip-if-zero 加 1 并且若为 0 则跳步
ISZ R1 如果 R1 是 0,就跳到 311,否则 R1 = R1 + 1
BR 301 无条件跳转回 301
# 过程调用指令
什么时候必须使用栈?递归调用
PC + deta 为什么是下一条指令的地址?
三种常用的保存返回地址的位置:寄存器、被调过程开始处、栈顶部
寄存器:
缺点是只能单线程调用,支持没有嵌入的调用
返回地址存于过程开始处:
4101 放在 4500,4601 放在 4800,返回 4800 的值到 4601,4651 放到 4800,再返回 4651,返回 4101。
函数的开头地址不会被修改(只要没有被调用),但是自己调用自己,会造成地址的覆盖
使用栈:解决递归的问题
# 操作数
# 操作数:地址
零地址、一地址、二地址、三地址的操作数
指令越短、cpu 越简单
指令越长、cpu 越复杂、成本上升
# 操作数:数值
# 操作数:字符
# 操作数:逻辑数据
# 操作数:大端序和小端序
大端序 —— 高位放小地址
小端序 —— 低位放小地址
以字节为单位
# 操作数引用
# 寻址方式
# 记号
# 立即寻址
立即寻址(不需要寻址,直接获得数据)
“直接放在指令里面” 是立即寻址
# 直接寻址
直接获得地址
在当代计算机体系中已不多见
# 间接寻址
先到主存,主存中存取了另一个地址
# 寄存器寻址
到寄存器,寄存器中操作数
# 寄存器间接寻址
参数 - 寄存器 - 主存 - 数据
# 偏移寻址
# 偏移寻址:相对寻址
# 偏移寻址:基址寄存器寻址
# 偏移寻址:变址寻址
IX 变址寄存器
重复操作
以上三种相对的对象不同