操作码、操作数、寻址方式

# Lecture14 - 指令系统

对应教材

image-20221202131829598

image-20221201161740120

# 指令

image-20221201161814535

# 指令要素

image-20221201162521172

# 指令表示

image-20221201162651133

如何避免指令的二义性?

image-20221201162709724

# 例子:Y = (A - B) / (C + D * E ) 三 / 两 / 单 / 零地址指令分别是怎么操作的?

image-20221201164205387

三地址:占用更多的指令操作数,但是不需要覆盖

双地址:有一个地址必须承担双重任务,需要先做一次 “move” 操作

单地址:第二个地址是隐含的,其隐含地址被称为 “累加器”(Accumulator, AC)

零地址:空指令、停机指令、中断指令

# 指令格式:扩展操作码

image-20221202132746822

# 例题:如何计算零地址、一地址、二地址指令条数?

image-20221201163012730

第一问

​ 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

# 指令格式

image-20221201163040707

# 操作码

# 差异与共性

image-20221202132908798

# 操作码:数据传送

image-20221202132933086

# 操作码:算数运算

image-20221202132953492

# 操作码:逻辑运算

image-20221202133031883

区分逻辑移位和算术移位

特别关注一下算数左移

# 操作码:输入输出

image-20221202133204651

# 操作码:控制转移

image-20221202133249793

# 分支指令 Branch Jump

image-20221202133454994

image-20221201165209301

BR 无条件跳转

BRE R1 R2 X 判断是否相等

BRZ 211 如果是 0,那么跳转到 211 的位置

BRE R1 R2 235 如果 R1 = R2,那么跳转到 235 的位置

# 跳步指令 Step

image-20221202133522328

ISZ increment-and-skip-if-zero 加 1 并且若为 0 则跳步

ISZ R1 如果 R1 是 0,就跳到 311,否则 R1 = R1 + 1

BR 301 无条件跳转回 301

# 过程调用指令

image-20221201170849399

image-20221201164024643 什么时候必须使用栈?递归调用

PC + deta 为什么是下一条指令的地址?

三种常用的保存返回地址的位置:寄存器、被调过程开始处、栈顶部

  1. 寄存器:

    缺点是只能单线程调用,支持没有嵌入的调用

  2. 返回地址存于过程开始处:

    4101 放在 4500,4601 放在 4800,返回 4800 的值到 4601,4651 放到 4800,再返回 4651,返回 4101。

    函数的开头地址不会被修改(只要没有被调用),但是自己调用自己,会造成地址的覆盖

  3. 使用栈:解决递归的问题

# 操作数

image-20221202135837472

# 操作数:地址

image-20221202140015572

零地址、一地址、二地址、三地址的操作数

指令越短、cpu 越简单

指令越长、cpu 越复杂、成本上升

# 操作数:数值

image-20221202140222294

# 操作数:字符

image-20221202140259609

# 操作数:逻辑数据

image-20221202140526641

# 操作数:大端序和小端序

image-20221201164946182

大端序 —— 高位放小地址

小端序 —— 低位放小地址

image-20221202140549149

以字节为单位

# 操作数引用

image-20221202141028247

# 寻址方式

image-20221201171841509

image-20221201171918273

# 记号

image-20221202141050795

# 立即寻址

立即寻址(不需要寻址,直接获得数据)

image-20221202141130201

“直接放在指令里面” 是立即寻址

# 直接寻址

image-20221202141210970

直接获得地址

在当代计算机体系中已不多见

# 间接寻址

image-20221202141228399

先到主存,主存中存取了另一个地址

# 寄存器寻址

image-20221202141247348

到寄存器,寄存器中操作数

# 寄存器间接寻址

image-20221202141326253

参数 - 寄存器 - 主存 - 数据

# 偏移寻址

image-20221202141350941

# 偏移寻址:相对寻址

image-20221202141443552

# 偏移寻址:基址寄存器寻址

image-20221202141504937

# 偏移寻址:变址寻址

image-20221202141537139

IX 变址寄存器

重复操作

以上三种相对的对象不同

# 栈寻址

image-20221202141551627

image-20221202141630182

image-20221202141636236

image-20221202141641806

# 指令格式的设计原则

image-20221202141657479

image-20221202141719616

image-20221202141727547

image-20221202141738268

# 指令集设计

image-20221202141757763

image-20221202141802927

# 总结

image-20221202141817797