当前位置: 首页 > news >正文

《计算机组成原理》第 7 章 - 指令系统

目录

7.1 机器指令

7.1.1 指令的一般格式

📌 案例:简单指令格式模拟(Java)

7.2 操作数类型和操作类型

7.2.1 操作数类型

7.2.2 数据在存储器中的存放方式

大端模式 vs 小端模式

📌 案例:大端小端转换(Java)

7.2.3 操作类型

7.3 寻址方式

7.3.1 指令寻址

7.3.2 数据寻址

常见寻址方式:

7.4 指令格式举例

7.4.1 设计指令格式应考虑的因素

7.4.2 指令格式举例(假设 32 位指令)

7.4.3 指令格式设计举例(Java 类模拟)

7.5 RISC 技术

7.5.1 RISC 的产生和发展

7.5.2 RISC 的主要特征

7.5.3 RISC 和 CISC 的比较

📊 思维导图

🚀 流程图示例


7.1 机器指令

7.1.1 指令的一般格式

指令组成:操作码(OP) + 地址码(Address)
操作码:决定指令功能(如加法、跳转)
地址码:指示操作数或指令地址

📌 案例:简单指令格式模拟(Java)
/*** 模拟指令格式类*/
public class Instruction {private int opcode; // 操作码(4位,0-15)private int address; // 地址码(28位,0-2^28-1)// 构造方法:传入操作码和地址码public Instruction(int opcode, int address) {this.opcode = opcode & 0x0F; // 保留低4位作为操作码this.address = address & 0xFFFFFFF; // 保留低28位作为地址码}// 获取操作码public int getOpcode() {return opcode;}// 获取地址码public int getAddress() {return address;}public static void main(String[] args) {// 示例:加法指令(操作码0001),操作数地址0x123456Instruction addInst = new Instruction(0x01, 0x123456);System.out.println("操作码:" + addInst.getOpcode()); // 输出1System.out.println("地址码:" + addInst.getAddress()); // 输出123456}
}

7.2 操作数类型和操作类型

7.2.1 操作数类型

  • 数据类型:整数、浮点数、字符、布尔
  • 地址类型:存储器地址、寄存器地址

7.2.2 数据在存储器中的存放方式

大端模式 vs 小端模式
数据(0x12345678)大端模式(高位在前)小端模式(低位在前)
地址 0x000x120x78
地址 0x010x340x56
地址 0x020x560x34
地址 0x030x780x12
📌 案例:大端小端转换(Java)
public class EndianConverter {// 大端转小端public static byte[] bigToLittle(byte[] bigEndian) {byte[] littleEndian = new byte[bigEndian.length];for (int i = 0; i < bigEndian.length; i++) {littleEndian[i] = bigEndian[bigEndian.length - 1 - i];}return littleEndian;}public static void main(String[] args) {byte[] big = {0x12, 0x34, 0x56, 0x78}; // 大端模式数据byte[] little = bigToLittle(big); // 转换为小端System.out.println("小端模式:");for (byte b : little) {System.out.print(String.format("%02X ", b)); // 输出78 56 34 12}}
}

7.2.3 操作类型

  • 算术运算:加减乘除
  • 逻辑运算:与或非异或
  • 数据传送:LOAD/STORE
  • 控制转移:JMP/CONDITIONAL JUMP

7.3 寻址方式

7.3.1 指令寻址

  • 顺序寻址:按 PC 自动递增寻址
  • 跳跃寻址:通过 JMP 指令改变 PC 值

7.3.2 数据寻址

常见寻址方式:
  1. 立即寻址:操作数直接在指令中
    int a = 10; // 立即数10
    
  2. 直接寻址:地址码为操作数地址
    int[] arr = {1, 2, 3};
    int b = arr[1]; // 直接寻址arr[1]
    
  3. 间接寻址:地址码为指针地址
    int x = 5;
    int* ptr = &x; // 指针存储x的地址(间接寻址)
    
  4. 寄存器寻址:操作数在寄存器中
    // 假设寄存器R1存储值为10
    int c = R1; // 寄存器寻址
    

7.4 指令格式举例

7.4.1 设计指令格式应考虑的因素

  • 字长
  • 操作类型数量
  • 寻址方式种类
  • 寄存器数量

7.4.2 指令格式举例(假设 32 位指令)

操作码(4 位)寻址方式(2 位)寄存器号(3 位)地址码(23 位)
0001(加法)01(直接寻址)001(R1)0x123456

7.4.3 指令格式设计举例(Java 类模拟)

/*** 扩展指令格式类*/
public class ExtendedInstruction {private int opcode; // 4位private int addressingMode; // 2位(0-3)private int regNum; // 3位(0-7)private int address; // 23位public ExtendedInstruction(int opcode, int addressingMode, int regNum, int address) {this.opcode = opcode & 0x0F;this.addressingMode = addressingMode & 0x03;this.regNum = regNum & 0x07;this.address = address & 0x1FFFFFF; // 23位掩码}public static void main(String[] args) {// 示例:乘法指令(0010),寄存器寻址(01),R2,地址0x89ABCExtendedInstruction mulInst = new ExtendedInstruction(0x02, 0x01, 0x02, 0x89ABC);System.out.println("操作码:" + mulInst.opcode); // 2System.out.println("寻址方式:" + mulInst.addressingMode); // 1}
}

7.5 RISC 技术

7.5.1 RISC 的产生和发展

  • 背景:CISC 指令集复杂,执行效率低
  • 发展:80 年代出现 RISC 架构(如 MIPS、ARM)

7.5.2 RISC 的主要特征

  1. 指令集简单(约 20-50 条基本指令)
  2. 单周期指令执行
  3. 大量通用寄存器
  4. 采用 LOAD/STORE 结构访问内存

7.5.3 RISC 和 CISC 的比较

特性RISCCISC
指令数量少(简单指令)多(复杂指令)
执行周期单周期多周期
设计重点硬件执行效率软件兼容性
典型架构ARM、RISC-Vx86

📊 思维导图

```mindmap
## **7.1 机器指令**
- 指令格式:操作码+地址码
## **7.2 操作数与操作类型**
- 数据类型:整数/浮点/字符
- 存储方式:大端/小端
- 操作类型:算术/逻辑/控制
## **7.3 寻址方式**
- 指令寻址:顺序/跳跃
- 数据寻址:立即/直接/间接
## **7.4 指令格式设计**
- 设计因素:字长/操作数/寻址
- 案例:32位指令格式
## **7.5 RISC技术**
- 特征:简单指令/单周期
- 对比:与CISC的主要区别

🚀 流程图示例

💡 说明

  • 代码均经过简化模拟,实际计算机指令系统需结合硬件架构
  • 建议通过模拟器(如 QEMU、Mars MIPS)动手调试指令执行过程
  • 关注后续章节:第 8 章 - 中央处理器(CPU)原理

📢 欢迎留言讨论指令系统的难点!
如果需要某部分的扩展案例或代码优化,可随时告知~

http://www.xdnf.cn/news/678817.html

相关文章:

  • 恶意npm与VS Code包窃取数据及加密货币资产
  • 科研级计算服务器 稳定支撑创新研究
  • 系统设计——项目设计经验总结3
  • int c =5; 代码解释
  • 《计算机组成原理》第 5 章 - 输入输出系统
  • 冒泡排序:像煮汤一样让数字「冒泡」
  • centos7安装MySQL(保姆级教学)
  • Linux信号量(32)
  • 鸿蒙OSUniApp 开发的滑动图片墙组件#三方框架 #Uniapp
  • 方正字库助力华为,赋能鸿蒙电脑打造全场景字体解决方案
  • 如何验证 AXI5 原子操作
  • leetcode刷题日记——完全二叉树的节点个数
  • Java怎么实现父子线程的值传递?InheritableThreadLocal类和transmittable-thread-local类?
  • Unity3D仿星露谷物语开发53之库存管理页面
  • Introduction to SQL
  • 【键盘说明书备份】ENERGYFORT
  • 编程日志5.27
  • MySQL :MySQL基本概念
  • 高性能计算 | 硅光芯片代工厂揭秘——技术特点与未来演进
  • SpringBoot集成jwt,实现token验证
  • 鸿蒙OSUniApp 实现自定义的侧边栏菜单组件#三方框架 #Uniapp
  • SQLord: 基于反向数据生成和任务拆解的 Text-to-SQL 企业落地方案
  • CMake 在尝试下载 Boost 时失败:SHA256 校验和与预期值不匹配
  • 【第1章 基础知识】1.8 在 Canvas 中使用 HTML 元素
  • 力扣HOT100之回溯:131. 分割回文串
  • 基于Matlab实现各种光谱数据预处理
  • Turf.js:前端地理空间分析的瑞士军刀
  • 2025山东CCPC补题
  • 基于Python的简易聊天机器人实现:从原理到实践
  • 组合API-provide和inject函数