一、指令周期
1. 定义与组成
- 定义:CPU取出并执行一条指令所需的全部时间,称为指令周期。
- 子周期划分:
- 取指周期(必选):从存储器取指令到指令寄存器(IR)。
- 间址周期(可选):处理间接寻址,获取操作数的真实地址。
- 执行周期(必选):执行指令规定的操作。
- 中断周期(可选):处理中断请求。
- 特性:
- 不同指令的周期长度不同。
- 取指和执行周期必然存在,间址和中断周期视情况触发。
- 每个子周期由多个时钟周期构成(时钟周期是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. 取指周期数据流
- 流程:
- PC → MAR:将PC中的指令地址送入内存地址寄存器(MAR)。
- 发出读命令:控制单元通过控制总线向存储器发出读信号,MAR地址通过地址总线传至存储器。
- 读取指令:存储器将指令读出,经数据总线传至MDR。
- 指令存入IR:MDR中的指令代码送入IR。
- PC自增:PC值增加,增量由指令字长决定。
- 关键序列:PC → MAR → 主存 → MDR → IR,PC++。
2. 间址周期数据流
- 作用:解决间接寻址时无法直接获取操作数地址的问题。
- 流程:
- 根据IR中地址码确定操作数有效地址。
- 有效地址送入MAR。
- 发出读命令,MAR指示的内存单元数据读入MDR。
- 特点:读取操作数本身,而非指令。
3. 执行周期数据流
- 特点:因指令类型不同,操作差异大,无统一数据流模板。
- 操作类型:包括算术逻辑运算、数据传送、控制转移等。
4. 中断周期数据流(正常执行一个指令,中断程序)
- 流程:
- 堆栈指针(SP)调整:SP减一(栈从高地址向低地址生长)。
- 栈地址传送:SP值送入MAR。
- 断点写入准备:发出写命令。
- 数据入栈:PC值(断点地址)写入栈。
- 中断服务程序跳转:将中断向量地址送入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值,并继续执行未完成的主程序。以下是具体流程和原因。