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

26-计组-指令执行过程

一、指令周期

1. 定义与组成

  • 定义:CPU取出并执行一条指令所需的全部时间,称为指令周期
  • 子周期划分
    1. 取指周期(必选):从存储器取指令到指令寄存器(IR)。
    2. 间址周期(可选):处理间接寻址,获取操作数的真实地址。
    3. 执行周期(必选):执行指令规定的操作。
    4. 中断周期(可选):处理中断请求。
  • 特性
    • 不同指令的周期长度不同。
    • 取指和执行周期必然存在,间址和中断周期视情况触发。
    • 每个子周期由多个时钟周期构成(时钟周期是CPU最小时间单位)。

2. 机器周期

  • 定义:人为设计的时间单位,通常等于一次访存时间(当指令字长=存储字长时,机器周期=取指周期)。
  • 与存储字长关系:反映存取一个存储单元的时间。
  • 实际应用
    • 指令字长为存储字长的倍数时,取指周期需多个机器周期(例:指令占2个存储单元 → 取指需2个机器周期)。
    • 间址、执行、中断周期的机器周期数因指令而异。

  • 判断流程
    • 间址周期:仅在间接寻址时触发(Y/N)。
    • 中断周期:仅在检测到中断请求时触发(Y/N)。

二、指令执行过程

1. 取指令

  • 核心机制:程序计数器(PC)指向下条指令地址,通过访存将指令送入指令寄存器(IR)。
  • 细节
    • 可能经过内存数据寄存器(MDR)中转或直接进入IR。
    • 例:PC=103,从主存地址103取指令。
  • PC自增:取指后,PC自动增加,增量由指令字长和编址方式决定。

2. 译码

  • 操作:对IR中的操作码进行译码,生成对应控制信号。
  • 示例(ADD指令,隐含寻址):
    • 一个操作数地址由指令给出(如104)。
    • 另一个操作数隐含在累加器(ACC)中。

3. 源操作数地址计算并取操作数

  • 寻址处理
    • 根据寻址方式计算有效地址。
    • 存储器数据可能需多次访存。
  • 示例(隐含寻址):
    • 从指令解析地址104,读取104处数据到寄存器。
    • 另一操作数直接从ACC获取。

4. 执行数据操作

  • 过程
    • 操作数送入ALU执行运算(如加法)。
    • 结果暂存于ALU输出端寄存器。
  • 注意:复杂指令的执行周期较长。

5. 目的操作数地址计算并存结果

  • 存储方式
    • 寄存器数据:直接写入目标寄存器。
    • 存储器数据:需计算目的地址并访存。
  • 特殊情形:目的地址可能需额外计算(如基址寻址)。


三、指令周期的数据流

1. 取指周期数据流

  • 流程
    1. PC → MAR:将PC中的指令地址送入内存地址寄存器(MAR)。
    2. 发出读命令:控制单元通过控制总线向存储器发出读信号,MAR地址通过地址总线传至存储器。
    3. 读取指令:存储器将指令读出,经数据总线传至MDR。
    4. 指令存入IR:MDR中的指令代码送入IR。
    5. PC自增:PC值增加,增量由指令字长决定。

  • 关键序列:PC → MAR → 主存 → MDR → IR,PC++。

2. 间址周期数据流

  • 作用:解决间接寻址时无法直接获取操作数地址的问题。
  • 流程
    1. 根据IR中地址码确定操作数有效地址。
    2. 有效地址送入MAR。
    3. 发出读命令,MAR指示的内存单元数据读入MDR。
  • 特点:读取操作数本身,而非指令。

3. 执行周期数据流

  • 特点:因指令类型不同,操作差异大,无统一数据流模板。
  • 操作类型:包括算术逻辑运算、数据传送、控制转移等。

4. 中断周期数据流(正常执行一个指令,中断程序)

  • 流程
    1. 堆栈指针(SP)调整:SP减一(栈从高地址向低地址生长)。
    2. 栈地址传送:SP值送入MAR。
    3. 断点写入准备:发出写命令。
    4. 数据入栈:PC值(断点地址)写入栈。
    5. 中断服务程序跳转:将中断向量地址送入PC。
  • 调整堆栈指针:堆栈指针(SP)值减1,为保存断点地址腾出栈空间。因为堆栈从高地址向低地址生长,SP减小指向新的栈顶。
  • 传送栈地址:将调整后的SP值送入内存地址寄存器(MAR),MAR存储将要写入断点地址的栈顶地址。
  • 发出写命令:控制单元通过控制总线向主存发出写命令,同时将MAR中的栈顶地址通过地址总线传送到主存,准备写入数据。
  • 保存断点地址:将程序计数器(PC)中的当前程序地址(断点)通过数据总线写入主存的栈顶地址(MAR指定的位置),完成PC值压栈。
  • 加载中断向量地址:将中断服务程序的入口地址(中断向量地址,通常由中断控制器提供)送入PC,更新PC值,准备跳转到中断服务程序。
  • SP本质:逻辑寄存器,通过存储地址值实现指向。

为什么需要将断点地址设置为新的栈顶(SP减1)?

  • 数据覆盖风险:原SP地址可能已有数据,直接写入会破坏栈结构。
  • 违反栈操作规则:压栈要求SP先减1再写入,这是堆栈设计的标准逻辑。
  • 影响后续操作:直接写入原SP地址会导致栈顶指针混乱,后续压栈或出栈操作可能出错。
  • 中断返回错误:如果PC值未正确保存到新的栈顶,返回时可能跳转到错误的地址,导致程序崩溃。

问题解答:中断服务程序执行完后,SP会+1并继续执行未执行的程序吗?

答案:是的,执行完中断服务程序后,CPU会通过出栈操作将堆栈指针(SP)加1,从栈中恢复中断前的PC值,并继续执行未完成的主程序。以下是具体流程和原因。

http://www.lryc.cn/news/587086.html

相关文章:

  • HTML5 离线存储
  • MyBatis04-MyBatis小技巧
  • Typecho后台编辑器自定义按钮开发实战指南
  • Spring Boot 集成 Spring Security 完整示例
  • Sping AI Alibaba
  • 《区间dp》
  • Linux锁的概念及线程同步
  • Python异步编程
  • 【版本控制】Perforce Helix Core (P4V) 完全入门指南(含虚幻引擎实战)
  • CAU数据挖掘第四章 分类问题
  • 从儿童涂鸦到想象力视频:AI如何重塑“亲子创作”市场?
  • LAN-401 linux操作系统的移植
  • 在线事务处理OLTP(Online Transaction Processing)负载是什么?
  • vector各种接口的模拟实现
  • python 虚拟环境 Anaconda Miniconda
  • 音视频学习(三十八):像素与位深
  • Linux | 数据库操作基础
  • 【ROS2】自定义消息接口的创建和使用
  • # 通过wifi共享打印机只有手动翻页正反打印没有自动翻页正反打印,而通过网线连接的主机电脑可以自动翻页正反打印
  • 信息收集(外围打点)
  • 在上海开发小程序,怎么做出“高级感”?
  • sql:sql在office中的应用有哪些?
  • 机器学习sklearn入门:使用KNN模型分类鸢尾花和简单调参
  • Matplotlib(一)- 数据可视化与Matplotlib
  • 前端性能优化利器:懒加载技术原理与最佳实践
  • ADRC自抗扰控制—深度解析与实战指南2
  • 适配器模式:兼容不兼容接口
  • 《[系统底层攻坚] 张冬〈大话存储终极版〉精读计划启动——存储架构原理深度拆解之旅》-系统性学习笔记(适合小白与IT工作人员)
  • Redis数据类型之zset
  • 补:《每日AI-人工智能-编程日报》--2025年7月12日