计算机组成原理笔记(十四)——3.4指令类型

一台计算机的指令系统可以有上百条指令,这些指令按其功能可以分成几种类型,下面分别介绍。

3.4.1数据传送类指令

一、核心概念与功能定位

数据传送类指令是计算机指令系统中最基础的指令类型,负责在 寄存器、主存、I/O设备 之间高效复制数据。这类指令的特点是 不改变数据本身的值,仅实现数据的物理或逻辑传递。

二、分类与典型指令

根据数据源与目标的物理位置不同,数据传送类指令可细分为以下4类:

类型功能典型指令汇编示例
通用传送寄存器/主存间的数据复制MOV, LDA (Load), STA (Store)MOV R1, R2
STA [2000H], R0
堆栈操作基于堆栈结构实现数据压入和弹出PUSH, POPPUSH AX
POP BX
I/O操作CPU与I/O设备间的数据交互IN, OUTIN AL, 60H
OUT 80H, AL
数据交换直接交换两个数据源的值XCHG, XCHXCHG AX, BX

三、执行流程与硬件支持

1. 通用传送指令(如MOV)

功能:将源操作数复制到目标位置,源数据保留。
核心步骤

  1. 取指令:从内存取出指令并译码。
  2. 获取源数据:根据寻址方式读取源地址数据。
  3. 写入目标:将数据写入目标地址。

在这里插入图片描述

硬件协作

  • 寄存器传输:通过内部总线直接传递数据。
  • 主存访问:需要 MAR(内存地址寄存器)保存地址,MDR(内存数据寄存器)暂存数据。

2. 堆栈操作指令(PUSH/POP)

核心流程(基于自底向上生成的内存堆栈):

  • PUSH流程
    1. SP指针下移:SP ← SP - 1(x86架构相反,上移)。
    2. 数据写入栈顶:将数据存入SP指向的内存单元。

在这里插入图片描述

  • POP流程
    1. 读取栈顶数据。
    2. SP指针上移:SP ← SP + 1(x86架构相反,下移)。

在这里插入图片描述

示例(x86架构):

PUSH EAX    ; 将EAX内容压入栈顶,SP-4
POP EBX     ; 将栈顶数据弹出到EBX,SP+4

3. I/O传送指令(IN/OUT)

工作原理

  • 独立编址:I/O端口与内存地址分开,通过专用IN/OUT指令访问(如x86)。
  • 统一编址:I/O设备映射到内存地址空间(如ARM的MMIO)。

IN指令流程(独立编址):

在这里插入图片描述

四、关键硬件支持与总线信号

  1. 关键寄存器
    • MAR(地址寄存器):保存目标内存地址。
    • MDR(数据寄存器):临时存储待写入的数据。
  2. 总线控制信号
    • MIO信号:区分内存与I/O操作(1=内存,0=IO)。
    • REQ信号:请求总线使用权。
    • WE信号:写使能(1=写,0=读)。

五、典型应用场景

  1. 函数调用上下文保存
    • PUSH保存返回地址、参数和寄存器值。
    • POP恢复现场,继续执行主程序。
  2. 中断处理
    • 通过PUSH保存程序状态(PC、标志寄存器)。
  3. 动态内存管理
    • MOV指令在内存和寄存器间频繁交换临时数据。

六、联合寻址方式

数据传送指令支持的 寻址方式决定效率

  • 直接寻址:指令直接包含有效地址(如MOV AX, [2000H])。
  • 寄存器间接寻址:地址存放在寄存器(如MOV AX, [BX])。
  • 基址/变址寻址:组合基址寄存器和偏移量(如MOV AX, [SI+10H])。

七、高级应用与优化

  • DMA控制:绕过CPU实现内存与外设直接数据传输。
  • 原子操作:通过XCHG实现锁机制(如自旋锁)。
  • 零地址指令优化:利用堆栈隐式寻址减少指令长度(如PUSH/POP)。

示例总结:寄存器与内存数据传输模型

在这里插入图片描述

3.4.2运算类指令

一、运算类指令的类别

运算类指令主要分为 算术运算指令逻辑运算指令,具体分类如下:

1. 算术运算指令

  • 加法(ADD/ADC):完成加法操作,ADC 是带进位的加法。

  • 减法(SUB/SBB):完成减法操作,SBB 是带借位的减法。

  • 乘法(MUL/IMUL):无符号乘法(MUL)和有符号乘法(IMUL)。

  • 除法(DIV/IDIV):无符号除法(DIV)和有符号除法(IDIV)。

  • 增量/减量(INC/DEC):对操作数加1或减1。

  • 比较(CMP):计算两数的差值,但不保存结果,仅更新标志位。

2. 逻辑运算指令

  • 按位与(AND)

  • 按位或(OR)

  • 按位异或(XOR)

  • 按位取反(NOT)

  • 移位操作

  • 算术移位:保留符号位(SAR、SAL)。

  • 逻辑移位:不保留符号位(SHL、SHR)。

  • 循环移位:带进位或不带进位(ROR、ROL)。

二、运算指令的执行流程

运算指令分为以下阶段(以加法指令为例):

1. 取指阶段(Fetch)

  • 动作:从程序计数器(PC)指示的地址中取出指令。

  • 数据流
    在这里插入图片描述

2. 译码阶段(Decode)

  • 动作:解析指令,确定操作码(ADD)和操作数类型(寄存器或内存)。

  • 关键:控制单元(CU)生成控制信号。

3. 执行阶段(Execute)

  • 数据通路
  1. 取操作数:从寄存器或内存读取操作数。

  2. ALU运算:执行具体的算术或逻辑操作。

  3. 更新标志位:溢出(OF)、进位(CF)、零(ZF)、符号(SF)等。

4. 写回阶段(Write Back)

  • 动作:将结果存入目标寄存器或内存。

  • 关键:影响后续指令的条件分支(如JNZ)。

三、标志位的作用

运算指令执行后会影响以下标志位:

  • ZF(Zero Flag):结果为0时置1。

  • OF(Overflow Flag):有符号运算溢出时置1。

  • CF(Carry Flag):无符号运算进位或借位时置1。

  • SF(Sign Flag):结果的符号位(最高位)为1时置1。

四、示例:ADD指令的完整流程

假设执行指令 ADD R1, R2, R3(将 R2 和 R3 的值相加,结果存到 R1):

流程图

在这里插入图片描述

步骤详解

  1. 取指令:从当前 PC 指向的内存地址读取指令。

  2. 译码:识别是 ADD 指令,提取操作数地址 R2 和 R3。

  3. 读取操作数:从寄存器 R2、R3 中取出数据。

  4. ALU运算:ALU 执行加法运算,生成结果。

  5. 更新标志

  • 若结果为零,置 ZF=1。

  • 若结果溢出,置 OF=1。

  1. 写回结果:将结果存入目标寄存器 R1,PC 自增指向下一指令。

五、典型运算类指令对比

指令类型操作符功能示例(汇编)
加法ADD寄存器或立即数加法ADD AX, 10
逻辑运算AND按位与操作AND AX, 0xFF
移位SHL左移(逻辑或算术)SHL AX, 1
比较CMP比较两数并更新标志位CMP AX, BX

六、核心概念总结

  • 数据通路:涉及寄存器、ALU、内存的协同操作。

  • 控制信号:CU 通过解析操作码发出信号,控制数据流动。

  • 标志位:影响条件分支指令(如 JEJNE 等)的执行。

通过以上内容,可以全面理解运算类指令在计算机中的执行机制和关键流程。

3.4.3程序控制类指令

程序控制类指令用于改变程序的执行顺序,实现分支、循环、子程序调用等功能。

一、核心分类及功能

  1. 无条件转移指令(JMP)

    • 功能:直接修改程序计数器(PC),跳转到指定地址执行。
    • 示例JMP LABEL
    • 流程图
      在这里插入图片描述
  2. 条件转移指令(Jump Conditional)

    • 功能:根据条件码(状态寄存器标志)决定是否跳转。

常见类型

指令条件说明
JE/JZZF=1结果为零
JNE/JNZZF=0结果不为零
JG(SF=OF)&ZF=0有符号大于
JLSF≠OF有符号小于

在这里插入图片描述

  1. 子程序调用与返回

    • CALL:保存返回地址(PC+1压栈),跳转到子程序入口。
    • RET:弹出返回地址到PC,恢复主程序执行。
    • 流程示例
      在这里插入图片描述

二、关键机制详解

  1. 返回地址保存

    • 方法:大多数架构使用堆栈保存返回地址(CALL时压栈,RET时弹栈)。
    • 示例CALL 0x1000的执行步骤:
      1. 将当前PC(下一条指令地址)压入栈
      2. PC ← 0x1000
  2. 条件判断逻辑

    • 依赖标志位:ZF(零标志)、CF(进位)、SF(符号)、OF(溢出)。
    • 跳转电路:CPU内部通过状态寄存器和组合逻辑决定是否跳转。
  3. 寻址模式的影响

    • 相对跳转JMP +25(当前PC+25)。
    • 绝对跳转JMP 0xFF00(直接跳转到目标地址)。

三、综合执行流程

  1. 无条件转移(JMP)

在这里插入图片描述

  1. 条件转移(JE)

在这里插入图片描述

  1. 子程序调用(CALL/RET)
    在这里插入图片描述

四、典型应用场景

  1. 循环控制

    • 示例:通过LOOP递减计数器并判断是否为0。

      MOV CX, 5
      LOOP_START:; 循环体...LOOP LOOP_START  ; CX-1, if CX≠0跳转
      
  2. 分支选择

    • 多路分支:通过嵌套条件跳转实现if-elseswitch
  3. 中断处理

    • 隐式调用:硬件中断自动触发类似CALL的操作,保存上下文后跳转中断服务程序。

五、注意事项

  • 性能影响:跳转指令可能导致流水线停顿,需谨慎优化。
  • 栈平衡:子程序中需确保RET前栈指针与CALL时一致。
  • 标志位安全:子程序执行期间需保存和恢复相关寄存器避免破坏主程序状态。

3.4.4输入输出类指令

一、I/O类指令的核心功能

I/O类指令用于CPU与外部设备之间的数据交换和控制,主要包括:

  1. 数据传输:CPU与I/O设备之间交换数据(如键盘输入、屏幕输出)。
  2. 设备控制:发送指令控制外设(如启动磁盘读取)。
  3. 状态查询:读取外设状态(如判断设备是否就绪)。

典型I/O指令:

  • IN:从外设读取数据到CPU寄存器(输入)。
  • OUT:向外部设备发送数据(输出)。
  • START:启动外设操作(如开始打印)。
  • HALT:停止外设操作。

二、I/O指令的两种编址方式

1. 独立编址(I/O-Mapped I/O)

  • 特点:外设地址与内存地址完全独立,需专用IN/OUT指令操作。
  • 优点:I/O设备与内存地址空间不冲突。
  • 缺点:需要额外的控制逻辑。
  • 示例
    • IN AL, 60h:从I/O端口60h读取数据到寄存器AL
    • OUT 80h, AL:将AL的内容输出到I/O端口80h

在这里插入图片描述

2. 统一编址(Memory-Mapped I/O)

  • 特点:外设寄存器映射到内存地址空间,可通过普通访存指令访问。
  • 优点:简化指令设计,兼容通用指令。
  • 缺点:占用内存地址空间。
  • 示例
    • MOV AX, [0f000h]:读取外设0F000h的输入数据。
    • MOV [0f001h], AX:向0F001h端口写入数据。

三、典型I/O指令的执行流程

1. 输入指令(IN)执行流程

在这里插入图片描述

2. 输出指令(OUT)执行流程

在这里插入图片描述

四、关键硬件部件与流程图

1. 典型I/O系统结构

在这里插入图片描述

2. I/O指令执行的控制信号流程

在这里插入图片描述

五、设计案例分析

案例:从键盘输入字符并显示

在这里插入图片描述

六、关键问题与答案

  1. Q:独立编址和统一编址有何区别?

    • 独立编址需专用指令(如IN/OUT),外设端口独立;统一编址通过普通访存指令操作外设。
  2. Q:I/O指令为何需要状态寄存器?

    • 为了解决外设速度与CPU不匹配的问题。例如:CPU通过状态寄存器查询设备是否就绪(如“就绪位”是否为1)。
  3. Q:什么是轮询与中断?

    • 轮询:CPU持续查询外设状态(效率低,适用于简单设备)。
    • 中断:外设通过中断控制器主动通知CPU(效率高,复杂系统常用)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各开源协议一览

在 GitHub 上,开源项目通常会使用一些常见的开源协议来定义项目的使用、修改和分发规则。以下是目前 GitHub 上最常见的几种开源协议及其差异和示例说明: TL;DR 协议宽松程度是否强制开源专利保护适用场景MIT最宽松否无希望代码被广泛使用Apache 2.0宽松…

51c自动驾驶~合集17

我自己的原文哦~ https://blog.51cto.com/whaosoft/13793157 #汇聚感知、定位、规划控制的自动驾驶系统 自动驾驶技术在应用到车辆上之后可以通过提高吞吐量来缓解道路拥堵,通过消除人为错误来提高道路安全性,并减轻驾驶员的驾驶负担,从…

小程序开发指南

小程序开发指南 目录 1. 小程序开发概述 1.1 什么是小程序1.2 小程序的优势1.3 小程序的发展历程 2. 开发准备工作 2.1 选择开发平台2.2 开发环境搭建2.3 开发模式选择 3. 小程序开发流程 3.1 项目规划3.2 界面设计3.3 代码开发3.4 基本开发示例3.5 数据存储3.6 网络请求3.7 …

Day15:关于MySQL的编程技术——基础知识

前言:先创建一个练习的数据库和数据 1.创建数据库并创建数据表的基本结构 -- 创建练习数据库 CREATE DATABASE db_programming; USE db_programming;-- 创建员工表(包含各种数据类型) CREATE TABLE employees (emp_id INT PRIMARY KEY AUTO…

批处理脚本bat丨遍历一个包含项目名称的数组,并对每个文件中的项目执行 git pull 操作 (一键拉很多文件的代码)

文章目录 前言一、操作方式二、文件展示三、分析代码结构四、代码五、需要注意的潜在问题六、改进后的代码七、改进说明八、感谢 前言 由于之前git服务部署在本地服务器,处于代码安全角度考虑。领导让我将所有的项目代码手动物理备份一份并且发给他。 这种傻傻的操…

【C++】C与C++、C++内存空间、堆与栈

C嘎嘎嘎嘎嘎~ C与C的区别与联系 C内存空间 int global_var; // 未初始化全局变量,BSS段 const char* str "Hello"; // 字符串常量text段 in数据段void func() {static int static_var; // 未初始化的静态变量,数据段int local_var; …

舵机:机器人领域的“关节革命者”

机器人的技术,每一个细微的进步都可能引领一场行业变革。而在这场变革中,舵机作为机器人关节的核心部件,正悄然上演着一场革命性的应用风暴。从简单的关节运动到复杂的姿态控制,舵机以其卓越的性能和无限的可能,重新定…

微前端的不断探索之路—— qiankun 实战与思考!

全文目录: 开篇语📝 前言🛠️ 微前端是什么?为什么需要它?💡 先从“前端痛点”说起🧐 微前端的优势 🤹‍♀️ qiankun 简介与核心概念🌟 为什么选择 qiankun?…

拆解加密黑盒

在Web安全与数据爬取领域,JavaScript加密黑盒的逆向工程是核心技术之一。本文基于行业通用方法论与实战案例,提炼出一套标准化的五步逆向流程,涵盖目标定位、代码提取、逻辑分析、算法复现到自动化集成的全链路解决方案,帮助开发者…

IntelliJ IDEA 中安装和使用通义灵码 AI 编程助手教程

随着人工智能技术的发展,AI 编程助手逐渐成为提升开发效率的强大工具。通义灵码是阿里云推出的一款 AI 编程助手,它能够帮助开发者实现智能代码补全、代码解释、生成单元测试等功能,极大地提升了编程效率和代码质量。 IntelliJ IDEA 是一款广…

Redis 特性和应用场景

1. Redis特性 1)In-memory data structures Redis 在内存中存储数据,key 是 String, value 可以是 hash, list, set, sorted set, stream ... MySQL主要是通过 “表” 的方式来存储组织数据的 “关系型数据库” Redis主要是通过 “键值对”…

每天五分钟深度学习:非线性激活函数的导数

本文重点 本文探讨了神经网络中几种常见非线性激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、Softmax)的导数特性。通过对各激活函数导数的数学推导与实际应用分析,揭示了不同激活函数在梯度传播、收敛速度及模型表达能力方面的差异。研究发现,ReLU及其变体在计算效率与…

redis哨兵机制 和集群有什么区别:

主从: 包括一个master节点 和多个slave节点: master节点负责数据的读写,slave节点负责数据的读取,master节点收到数据变更,会同步到slave节点 去实现数据的同步。通过这样一个架构可以去实现redis的一个读写分离。提升…

关于读完《毛泽东选集》的一些思考迭代

看完毛选前四卷,从革命初期一直讲到抗战胜利,共75.8W字,花费67个小时读完。从1925年发表的“中国社会各阶级的分析”,跨越100年,通过67个小时向主席学习到: 实事求是 从实践中来再到实践中去 用辩证与发展…

MySQL——MVCC(多版本并发控制)

目录 1.MVCC多版本并发控制的一些基本概念 MVCC实现原理 记录中的隐藏字段 undo log undo log 版本链 ReadView 数据访问规则 具体实现逻辑 总结 1.MVCC多版本并发控制的一些基本概念 当前读:该取的是记录的最新版本,读取时还要保证其他并发事务…

【Linux篇】深入理解文件系统:从基础概念到 ext2 文件系统的应用与解析

文件系统的魔法:让计算机理解并存储你的数据 一. 文件系统1.1 块1.2 分区1.3 inode(索引节点) 二. ext2文件系统2.1 认识文件系统2.2 Block Group (块组)2.2.1 Block Group 的基本概念2.2.2 Block Group 的作用 2.3 块组内部结构2.3.1 超级块(Super Bloc…

3 VS Code 配置优化与实用插件推荐:settings.json 详解、CodeGeeX 智能编程助手及插件离线安装方法

1 优化 settings.json 文件 1.1 settings.json 简介 settings.json 是 VS Code 的核心配置文件,用于存储用户的个性化设置和偏好。通过该文件,用户可以自定义和覆盖 VS Code 的默认行为,包括但不限于以下方面: 编辑器外观&#…

【Java面试系列】Spring Cloud微服务架构中的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Cloud微服务架构中的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识 1. 引言 在微服务架构中,分布式事务处理是一个复杂且常见的问题。随着业务规模的扩大,单体应用逐渐拆分为多个微服务,每个服务…

力扣面试150题--有效的数独

Day 19 题目描述 思路 其实还挺简单的&#xff0c;主要的难点在于如何判断每个小数独是否满足要求 详细见代码 class Solution {public boolean isValidSudoku(char[][] board) {HashSet<Character> set new HashSet<>();//处理行HashSet<Character> set1…

达梦数据库-学习-15-大内存SQL相关视图介绍

目录 一、环境信息 二、介绍 三、数据字典表 1、V$MEM_POOL 2、V$SQL_STAT 3、V$SQL_STAT_HISTORY 4、V$LARGE_MEM_SQLS 5、V$SYSTEM_LARGE_MEM_SQLS 四、总结 一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Co…