【总结笔记】指令系统与寻址方式
本部分涵盖:RISC vs CISC辨识、MIPS三大指令格式、硬件参数推导、常见寻址方式、相对寻址与PC更新、大小端判断、标志位分析(ZF/SF/OF/CF)、条件转移指令、乘法溢出、数据通路。
一、RISC vs CISC 快速辨识
| 特征 | RISC | CISC |
|---|---|---|
| 指令字长 | 定长(如MIPS固定32位) | 变长(x86为1~15字节) |
| 访存指令 | 只有Load/Store访存 | 大多数指令可直接访存 |
| 寄存器 | 多(≥32个通用寄存器) | 少 |
| 控制器 | 硬布线控制器(流水线友好) | 微程序控制器 |
| 典型代表 | ARM、MIPS、RISC-V、PowerPC | x86(Intel/AMD)、IBM 370 |
判别题眼:看机器码字节数是否固定
- 固定(每条指令16进制字符数相同)→ RISC
- 不固定(各条指令字节数不同)→ CISC
x86变长原因:单字节操作码(如55=push ebp)、多字节寻址特征字节(ModR/M)和偏移量按需拼接。
二、硬件参数推导(必考配对关系)
| 硬件参数 | 对应题干信息 | 计算方式 |
|---|---|---|
| ALU宽度 | 计算机字长(机器字长) | 直接等于字长 |
| IR位数 | 指令字长 | 直接等于指令字长 |
| MAR位数 | 地址总线条数 | 等于地址线位数 |
| MDR位数 | 数据总线条数(或存储字长) | 等于数据线位数;若未指明则等于机器字长 |
| 可寻址空间 | 地址线条数 + 编址方式 | |
| 通用寄存器个数 | 寄存器字段位数 |
MDR陷阱:若题干明确说”数据总线8位”,MDR=8位,而非机器字长!
三、MIPS三大指令格式(定长32位)
R型(Register,寄存器-寄存器运算)
[ 000000(6位) | rs(源1) | rt(源2) | rd(目标) | op1/funct(功能码) ]
- 操作:
- 用途:算术逻辑运算(加减与或异或)、寄存器间接跳转(jr rs)
I型(Immediate,立即数/访存/分支)
[ op2(6位) | rs(源) | rt(目标/源) | imm(立即数/偏移量) ]
- 立即数运算:
- 访存Load/Store:,然后
- 条件分支:比较rs和rt,满足则
J型(Jump,长距离无条件跳转)
[ op3(6位) | target(长地址,剩余所有位) ]
- 操作:(高位保持当前PC高位不变)
操作码扩展(前缀码原理)
- 高位6位操作码总编码空间: 种
- R型占用
000000一种,内部靠功能码扩展 - I型与J型最多可用: 种
四、常见寻址方式速查
| 寻址方式 | 有效地址EA | 访存次数 | 核心用途 |
|---|---|---|---|
| 立即寻址 | A即为操作数(无EA) | 0次 | 常数操作,最快 |
| 直接寻址 | EA = A | 1次 | 访问固定地址全局变量 |
| 间接寻址 | EA = (A) | 2次(一级) | 通过地址访问地址 |
| 寄存器寻址 | OPR = (Ri),在寄存器 | 0次 | 最常用,最快 |
| 寄存器间接 | EA = (Ri) | 1次 | 指针访问 |
| 基址寻址 | EA = (BR) + A | 1次 | 多道程序/动态重定位 |
| 变址寻址 | EA = (IX) + A | 1次 | 数组遍历、循环 |
| 相对寻址 | EA = (PC) + A | 1次 | 分支跳转(PC相对) |
区别:基址寻址中基址寄存器BR由OS设定不变,偏移A可变;变址寻址中IX可变,A固定(数组首地址)
五、PC相对寻址(重点!)
关键公式:
PC的值:CPU取指后自动 ,所以执行时PC已指向下一条指令!
偏移量计算(已知源地址和目标地址求偏移量):
补码存储:若偏移量为负数(向前跳),需转换为补码存入指令
编址方式判断(看PC自增量):
- 16位指令,PC+2 → 按字节编址
- 32位指令,PC+4 → 按字节编址
- 16位指令,PC+1 → 按字编址
六、大小端判断
| 方式 | 定义 | 规律 |
|---|---|---|
| 大端(Big-Endian) | 高位字节存低地址 | 内存中顺序与人类书写顺序相同 |
| 小端(Little-Endian) | 低位字节存低地址 | 内存中顺序与书写顺序相反(x86、ARM常见) |
快速判别(以 0x12345678 存在地址 1000H):
地址: 1000H 1001H 1002H 1003H
大端: 12 34 56 78 (高字节在低地址,顺序相同)
小端: 78 56 34 12 (低字节在低地址,顺序相反)
机器码判别法:看偏移量字节在机器码中的顺序。若数值 0xFFFFFFD6 在机器码中排列为 D6 FF FF FF(低位在前)→ 小端。
七、标志位分析(ZF / SF / OF / CF)
| 标志位 | 含义 | 触发条件 |
|---|---|---|
| ZF(零标志) | 结果为0 | 运算结果全部为0时 ZF=1 |
| SF(符号标志) | 结果符号 | 结果最高位为1时 SF=1(即负数) |
| OF(溢出标志) | 有符号溢出 | |
| CF(进位/借位) | 无符号进借位 | 加法:最高位进位;减法: |
CF的计算(cmp A,B 题型固定三步法)
cmp A, B 底层执行 ,置标志位但不存结果:
- 写出无符号机器码(注意
unsigned 0-1 = 2^n-1,不是-1!) - 减法转补码加法:
- 判定CF:
- 直观法:(无符号比较)→ CF=1; → CF=0
- 硬件法:加法器最高位 → CF=1; → CF=0
条件转移的标志位规则:
| 比较 | 无符号(用CF/ZF) | 有符号(用SF/OF) |
|---|---|---|
| ZF=1 | ZF=1 | |
| CF=1 | SF⊕OF=1 | |
| CF=1 或 ZF=1 | (SF⊕OF=1) 或 ZF=1 | |
| CF=0 且 ZF=0 | (SF⊕OF=0) 且 ZF=0 |
八、条件转移指令
| 指令类型 | 说明 | 常见指令 |
|---|---|---|
| 条件转移 | 检查标志位,满足才跳 | jle、jl、jge、jg、je/jz、jne/jnz、jc、jo |
| 无条件跳转 | 必然跳 | jmp |
| 子程序调用 | 保存返回地址+跳转 | call |
| 子程序返回 | 从栈弹出PC | ret |
| 中断返回 | iret |
条件转移范围(位偏移量,按字节编址,指令长2字节):
九、乘法溢出判定
位有符号乘法结果为 位,若截断保存为 位:
判定条件:高 位不是低 位符号位的”纯复制”时,溢出。
- 即:高 位不全为 0 且不全为 1 时 → OF=1(溢出)
代数真值法(考场最直观):
- 计算真实结果的十进制值
- 看是否落在 位有符号数范围(如16位:)
- 超出范围 → 溢出
十、二维数组地址计算
数组 type a[M][N],首地址 Base,元素大小 字节:
- (总行数):不参与元素地址计算,只是循环上限
- (每行列数):决定行大小,参与计算
十一、立即数的零扩展 vs 符号扩展
| 场景 | 应用扩展方式 | 原因 |
|---|---|---|
| 有符号算术运算(加减偏移量) | 符号扩展 | 保持真值不变(负数补1,正数补0) |
| 逻辑操作(AND、OR、按位测试) | 零扩展 | 高位必须为0,不影响按位结果 |
| 访存基址寻址偏移量 | 符号扩展 | 需支持负偏移量(向低地址访问) |
| 无符号数操作 | 零扩展 | 无符号数无符号位概念 |
十二、高频易错汇总
| 错误 | 正确做法 |
|---|---|
| MDR宽度默认等于机器字长 | 题干明确数据线位数时,MDR=数据线位数 |
| I/J型操作码数算成64 | R型占了000000,I/J最多 种 |
| 相对寻址的基准PC是当前指令地址 | 基准PC是下一条指令地址(当前地址+指令长度) |
| 减法中 | 减法:,进位反向才是借位 |
| unsigned 0-1 = -1 | unsigned 0-1 = (最大无符号数,下溢回绕) |
| 乘法16位结果直接判定溢出 | 算真实十进制,超出才是溢出 |
| M参与数组地址计算 | 数组a[M][N]中M不参与地址计算,只有N参与 |
| 大端=低字节在低地址 | 大端=高字节在低地址(与书写顺序相同) |