计算机硬件基础——第五章:指令系统(二)

2023-11-15

指令

要求计算机执行特定操作的命令,是程序员智慧计算机工作的最小单位

指令系统

一台计算机全部指令的集合

也称为计算机指令集

80X86 CPU的常用指令

逻辑运算指令

用来对字或字节按位进行逻辑运算

逻辑与AND 指令

  • 指令格式 AND dest,src

  • 指令功能

    • 按位进行逻辑与

      • 有0为0,全1为1
    • 结果返回目的操作数

    • 设置CF=OF = 0

    • 影响SF,ZF,PF

    • 可用于复位一些位,但不影响其他位

      • 要置零的和“0”与
      • 维持不变的位和“1”与

逻辑或OR指令

  • 指令格式

    • OR dest,src
  • 指令功能

    • 按位进行逻辑或

      • 有1为1,全0为0
    • 结果返回目的操作数

    • 设置CF =OF= 0

    • 影响SF,ZF,PF

    • 可用于置位一些位,但不影响其他位

      • 要置1的为与“1”或
      • 维持不变的位与“0”或

逻辑非NOT 指令

  • 指令格式

    • NOT reg/mem
  • 指令功能

    • 按位进行逻辑非

      • 全部取反
    • 结果返回目的操作数

    • 不影响标志位

逻辑异或XOR 指令

  • 指令格式

    • XOR dest,src
  • 指令功能

    • 按位进行逻辑异或

      • 同为1,不同为0
    • 结果返回目的操作数

    • 设置CF =OF =0

    • 影响SF,ZF,PF

    • 可用于求反某些位,而不影响其他位

      • 要求反的和“1”异或
      • 维持不变的位和“0”

逻辑测试TEST指令

  • 指令格式

    • TEST dest,src
  • 指令功能

    • 按位进行逻辑与
    • 结果不返回目的操作数
    • 设置CF =OF = 0
    • 影响SF,ZF,PF

程序控制指令

控制程序的走向,实质是设法改变当前CS和IP的值

控制转移指令的特点

  • 段内转移

    • 目标地址在当前代码段内,指令值修改IP
  • 段间转移

    • 目标地址在其他代码段内,指令同时修改IP和CS
  • 可实现三种范围的跳转

    • 短转移 short

      • 段内转移,相对偏移量为1个字节
      • 取值范围:-128~+127
    • 近转移 near

      • 段内转移,相对偏移量为1个字
      • 取值范围:-32768~+32767
    • 远转移 far

      • 段间转移,目标地址与正常顺序的IP值不在同一个代码段内

无条件转移指令

  • 无条件转移到指定的地址去执行该地址开始的指令

  • 不影响标志位

  • 段内直接转移

    • 指令格式

      • JMP short label(8位)
      • JMP near ptr label(16位)
    • 指令功能

      • 程序转向的有效地址等于当前IP寄存器内容加上位移量
  • 段内间接转移

    • 指令格式

      • JMP R16/M16
    • 指令功能

      • 将一个16位寄存器或主存单元内容送入IP寄存器,作为新的指令指针
  • 段间直接转移

    • 指令格式

      • JMP far ptr label
    • 指令功能

      • 标号所在段的短地址值作为新的CS值
      • 标号在该段内的偏移地址作为新的IP地址
  • 段间间接转移

    • 指令格式

      • JMP far ptr mem
    • 指令功能

      • 转移目标地址存放在主存中连续的两个字单元中
      • 其中低位字送IP寄存器
      • 高位字送CS寄存器

有条件转移指令

  • 满足条件才转移

  • 对标志位均无影响

  • 单标志位转移指令

  • 无符号数的条件转移指令

  • 有符号数的条件转移指令

  • 测试CX条件转移指令

循环指令

  • 以CX寄存器作为计数指针

  • 每循环一次,CS-1

  • 当CX减至0,停止循环

  • 不影响标志位,属于段内短转移

  • 无条件循环指令

    • JCXZ label

      • CX = 0 ,循环
      • 否则顺序执行
    • LOOP label

      • CX<——CX-1
      • CX ! = 0 循环,否则顺序执行
  • 条件循环指令

    • LOOPPZ/LOOPPE label

      • CX<——CX-1
      • 若CX!= 0 且 ZF= 1循环,否则顺序执行
    • LOOPNZ/LOOPNE label

      • CX<——CX-1
      • 若CX!= 0 且 ZF= 0 循环,否则顺序执行

子程序调用和返回指令

  • 调用指令CALL
  • 返回指令RET

数据传送指令

功能

  • 把数据从一个位置传送到另一个位置

通用数据传送指令

  • MOV指令

    • 指令格式:MOV dest src

    • 指令功能:dest <——src

      • 将数据有源位置传送至目的位置
      • 源操作数不变,不影响标志位
    • 对操作数的规定

      • src和dest的数据类型要一致

      • 否则要用PTR指明类型

      • 关系图

        • 立即数不能作为目的操作数
        • CS不能作为目的操作数
        • 段寄存器之间不能相互传送
        • 存储器之间不能相互传送
        • 立即数不能给段寄存器传送
      • 错误示范

  • XCHG指令

    • 指令格式: XCHG reg , reg/mem

    • 指令功能: dest <——>src

      • 将寄存器或存储器中的内容与目的寄存器中的内容互相交换。
      • 不影响状态标志位
    • 对操作数的规定

      • src和dest的数据类型要一致
      • 两个存储器操作数之间不能时间直接交换
      • 段寄存器和立即数不能作为操作数

堆栈操作指令

  • 先进后出的主存区域

  • 使用SS段寄存器存放段地址

  • 两种基本操作

    • 数据压进堆栈PUSH
    • 数据弹出堆栈POP
  • 使用SP指明当前栈顶

    • 数据进入堆栈,SP减小
    • 数据弹出堆栈,SP增加
  • 进栈指令PUSH

    • 指令格式: PUSH r16/m16/seg

    • 指令功能

      • SP<——SP -2
      • SS :[SP ]<——r16/m16/seg
      • 先将SP减2作为当前栈顶
      • 然后将源操作数(通用寄存器和段寄存器内容或存储器操作数)传送到当前栈顶
  • 出栈指令POP

    • 指令格式 POP r16/m16/seg

    • 指令功能

      • r16/m16/seg<——SS :[SP ]
      • SP<——SP+2
      • 先将栈顶数据传送到目的操作数(通用寄存器,存储单元或段寄存器(CS除外))
      • 然后堆栈指针SP+2

标志传送类指令

  • 标志寄存器传送

    • 用来传送标志寄存器的内容
  • 标志位操作

    • 用来对CF,DF,IF三个标志位进行设置

      • 进位标志CF清零:CLC
      • 进位标志CF置1:STC
      • 进位标志CF取反:CMC
      • 方向标志DF清零:CLD
      • 方向标志DF置1:STD
      • 禁止可屏蔽中断IF:CLI
      • 允许可屏蔽中断IF:STI

地址传送类指令

输入输出指令

  • 用于完成输入/输出端口与累加器(AL/AX)之间的数据传送

  • 输入指令

    • 将外设数据传送至CPU

    • 指令格式

      • IN AL,I8

        • 字节输入,AL<——I/O端口I8
      • IN AX,I8

        • 字输入,AL<——I/O端口I8,AH<——I/O端口I8+1
      • IN AL,DX

        • 字节输入,AL<——I/O端口[DX],DX 中存放端口号
      • IN AX,DX

        • 字输入,AL<——I/O端口[DX],AH<——I/O端口[DX+1]
  • 输出质量

    • 将CPU数据传送至外设

    • 指令格式

      • OUT I8 ,AL

        • 字节输出,I/O端口I8<——AL
      • OUT I8 ,AX

        • 字输出,I/O端口I8<——AL ,I/O端口I8+1<——AH
      • OUT DX ,AL

        • 字节输出,I/O端口[DX]<——AL
      • OUT DX ,AX

        • 字输出,I/O端口[DX]<——AL ,I/O端口[DX+1]<——AH

算数运算指令

加法指令

  • 不带进位ADD

    • 指令格式

      • ADD reg,imm/reg/mem
      • ADD mem,imm/reg
    • 指令功能

      • 将源操作数与目的操作数相加
      • 结果送药目的操作数
      • 该指令影响标志位:CF、AF、PF、SF、OF和ZF
  • 带进位ADC

    • 指令格式

      • ADC reg ,imm/reg/eme
      • ADC mem,imm/reg
    • 指令功能

      • 源操作数与目的操作数相加
      • 再与进位CF相加
      • 结果送到目的操作数
      • 影响标志位:CF、AF、PF、SF、OF、ZF
      • 主要用于与ADD指令相结合实现多字节数相加
  • 增量指令INC

    • 指令格式

      • INC reg/mem
    • 指令功能

      • 将目的操作数的内容加1,
      • 将结果送回到目的操作数
      • 影响标志位AF、PF、SF、OF、ZF
      • 不影响CF

减法指令

  • 不带借位减法指令SUB

    • 指令格式

      • SUB reg,imm/reg/mem
      • SUB mem,imm/reg
    • 指令功能

      • 目的操作数与源操作数相减
      • 结果送到目的操作数
      • 影响标志位CF、AF、PF、SF、OF、ZF
  • 带借位减法指令SBB

    • 指令格式

      • SBB reg,imm/reg/mem
      • SBB mem,imm/reg
    • 指令功能

      • 目的操作数与源操作数相减
      • 再与CF相减
      • 结果送到目的操作数
      • 影响标志位CF、AF、PF、SF、OF、ZF
      • 主要用于与SUB指令结合实现多倍字长数相减
  • 减量指令DEC

    • 指令格式

      • DEC reg/mem
    • 指令功能

      • 目的操作数的内容减
      • 结果送回目的操作数
      • 影响AF、PF、SF、OF、ZF
      • 不影响CF
  • 求补指令NEG

    • 指令格式

      • NEG reg/mem
    • 指令功能

      • 将目的操作数求补运算
      • 结果送回目的操作数
      • 实际上是,用0减去操作数,结果送回
      • 影响标志位CF、AF、PF、SF、OF、ZF
  • 比较指令CMP

    • 指令格式

      • CMP reg,imm/reg/mem
      • CMP mem,imm/reg
    • 指令功能

      • 将目的操作数减去源操作数

      • 结果不送回

      • 影响标志位CF、AF、PF、SF、OF、ZF

      • 用于比较两个操作数的大小关系

        • 通过ZF的值判断两个数是否相等

        • 通过CF的值来判断两个无符号数的大小

        • 通过OF和SF的变化来判断两个有符号数的大小

          • OF = SF 目的操作数大
          • OF!=SF 目的操作数小

乘法指令

  • 用来实现两个二进制数的相乘运算

  • 无符号数乘法指令MUL

    • 指令格式

      • MUL R8/M8
      • MUL R16/M16
    • 指令功能

      • AX<——AL*SRC
      • DX,AX<——AX*SRC
      • 其中被乘数隐含在AL(或AX)中
      • 运算结果要保存在AX(或DX和AX)中
    • 如果结果的高半部分(字节操作的AH或字操作的DX)

      • 不为零,表明其内容是结果的有效位,CF = 1,OF= 1
      • 为零 否则为零
      • 其余状态标志无定义
  • 有符号数乘法指令IMUL

    • 指令格式

      • IMUL R8/M8
      • IMUL R16/M16
    • 指令功能

      • AX<——AL*SRC

      • DX,AX<——AX*SRC

      • 被乘数隐含在AL(或AX)中

      • 运算结果要保存在AX(或DX和AX)

      • 只有CF,OF有定义

      • 结果的高半部分(字节操作的AH或字操作的DX)

        • 是底半部分的符号扩展

          • CF = 0 OF = 0
        • 否则CF = 1 OF = 1

      • 符号扩展

        • 不改变数值大小和符号的情况下
        • 仅将其位数由字节变为字
        • 或者由字变为双字

除法指令

  • 无符号数除法指令DIV

    • 指令格式

      • DIV R8/M8
      • DIV R16/M16
    • 指令功能

      • AL<——商 AH<——余数
      • AX<——商 DX <——余数
      • 被除数隐含在AX(或DX和AX)中
      • 运算结果要保存在AX(DX和AX)中
    • 对标志位没有定义,但是却可能产生溢出

      • 除数为0,
      • 字节除时商超过位
      • 字除时商超过位
      • 会产生编号为0的内部中断
    • 无符号数除法

      • 有符号数除法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机硬件基础——第五章:指令系统(二) 的相关文章

  • python元组 列表 字符串最后一个下标_python字符串列表元组序列操作

    Table of Contents generated with DocToc python系列 字符串 列表 元组的操作 序列的访问及运算符 序列是为满足程序中复杂的数据表示 python支持组合数据类型 可以将一批数据作为一个整体进行数
  • 数据湖:设计更好的架构、存储、安全和数据治理

    问题导读 1 对数据湖有哪些预期 2 数据湖架构如何设计 3 如何做好数据治理工作 4 如何保障数据湖的安全 前言对任何业务来说 数据驱动的结果 预告和对趋势的预测都是必不可少的 今天 在我们所做的每件事中 都能看到某种分析的逻辑在背后 从
  • C语言输出3个整数最大值的案例教程

    思路分析 先比出2个整数的最大值 然后用最大值和第三个整数比较从而求出3个整数的最大值 我们今天用几种办法输出3个整数最大值 方法一 使用if else语句以及输入输出语句来编写 方法二 使用三元运算符以及输入输出语句来编写 方法三 使用自

随机推荐

  • JAVA 泛型的相关知识点

    泛型分为 1 泛型类 2 泛型接口 3 泛型方法 1 泛型类 定义 class Test
  • Python编程技巧和需要注意的地方——Pro

    目录 前言 1 多个大数字相加 2 同时访问多个相互关联的列表 3 访问列表的同时输出对应下标 4 熟练使用 和 5 关于类的get和set方法 6 熟练使用help和dir方法 7 什么时候使用set或dict而不是list 8 默认参数
  • 互联网大厂2021中秋礼盒pk,看完我又酸了……

    作者丨魏宇卓 来源丨运营研究社 ID U quan 马上又要到中秋节啦 每年中秋节 我最喜欢的就是吃着在便利店买的寒酸月饼 围观互联网大厂们在中秋礼盒上互相 battle 今年 大厂的月饼礼盒哪家强呢 我特地挑选了 10 家互联网大厂的中秋
  • 如何一次性批量打印PDF、Word、Excel、PPT和图片 - 文件批量打印工具

    一次性自动批量打印PDF WORD DOC DOCX Excel工作表XLS XLSX CSV PowerPoint PPTX PPT和JPG PNG TIF BMP图像 在日常工作生活中 我们时常需要通过打印机打印文件或照片 打印机都是逐
  • 【Unity Shader】概述以及Diffuse shader和unity5新功能Standard shader

    一 Diffuse shader介绍 Diffuse 即漫反射 可以想象成太阳光照射到某一个粗糙平面时 该平面向四面八方都会反射光线 这些光线中的某些光线会进入我们的眼睛 从而使我们看到这个平面 一个基本的漫反射光照模型 需要包括以下几个部
  • 0 基础 Java 自学之路(2023年最新版)

    目录 一 语言的选择 二 Java学习路线 三 学习资料哪里找 1 Java经典书籍推荐 2 Java经典视频推荐 3 经典博客推荐 四 如何规划时间 五 是否要报培训班 写了10多年的代码 之前做过某东的高级架构师 在技术这条路上跌跌撞撞
  • python-leetCode-给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数

    给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的 两个 整数 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定 nums 2 7 11 15 target 9 因
  • R语言编写函数

    基本思路参考此文章 http blog csdn net myl1992 article details 44936009 在这片博文中涉及到list相关知识 很受用 http blog csdn net u012543538 articl
  • Hudi 基础入门篇

    Hudi 诞生 Apache Hudi由Uber开发并开源 该项目在2016年开始开发 并于2017年开源 2019年1月进入 Apache 孵化器 且2020年6月称为Apache 顶级项目 目前最新版本 0 9 0版本 Hudi 一开始
  • JSONArray属性值的修改

    之前直接通过生成字符串后进行字符串替换实现的 实际上这里可能会替换调value的值中相同的字符 虽然概率很低 但是鉴于对个人的严格要求 还是严谨地修改了实现方法 主要基于如下的方法 public static JSONObject tran
  • VC++ 文件操作封装类

    头文件声明 SysUtils h pragma once include
  • 什么是模式识别,模式识别概念的基本介绍

    模式识别又常称作模式分类 从处理问题的性质和解决问题的方法等角度 模式识别分为有监督的分类 Supervised Classification 和无监督的分类 Unsupervised Classification 两种 模式还可分成抽象的
  • Python入门之类和对象

    对象 属性 方法 对象是类的实例 换句话说 类主要定义对象的结构 然后我们以类为模板创建对象 类不但包含方法定义 而且还包含所有实例共享的数据 封装 信息隐蔽技术 我们可以使用关键字 class 定义 Python 类 关键字后面紧跟类的名
  • TextureTailor自制Plist碎图工具

    最近在开发小游戏 美术资源是个令人头疼的问题 故搜寻了一些网上的资源文件 但是总被plist格式和png图片格式所困扰 在参考了一些大佬的代码后自制了一个符合我个人需求的小工具 先放源码地址 TextureTailor 再来预览一下效果 界
  • linux服务篇-RSYNC数据备份

    Rsync remote sync 是UNIX及类UNIX平台下一款神奇的数据镜像备份软件 它不像FTP或其他文件传输服务那样需要进行全备份 Rsync可以根据数据的变化进行差异备份 从而减少数据流量 提高工作效率 你可以使用它进行本地数据
  • 关于深度学习中的分类器

    因为之前一直都是用caffe做图像去噪 增强方面的工作 没太接触分类 上个学习会上通过报告学习了下关于分类的相关基础知识 为接下来分类的相关工作研究奠定下基础 基础之分类器 1 SVM 线性核SVM 一般应用于多分类 分类的结果 如3分类
  • 开关电源环路学习笔记(6)-开关变换器传递函数Gvd(s)推导过程

    终于到了最关键的环节 也是最难的环节 如何求出开关级的传递函数 也就是下图这一级 哎 不得不说 太难了 不过没办法 先前夸下海口 跟兄弟们说我要把环路搞清楚 现在搞不动也得搞啊 这一级之所以这么难 主要是有开关元器件 本身是非线性的 当然了
  • ip命令网络配置

    Linux的ip命令和ifconfig类似 但前者功能更强大 并旨在取代后者 使用ip命令 只需一个命令 你就能很轻松地执行一些网络管理任务 ifconfig是net tools中已被废弃使用的一个命令 许多年前就已经没有维护了 Linux
  • 华为方舟编译器开源项目编译第四弹——自带Java测试用例的编译

    在编译Java测试用例时的错误提示信息 javac option bootclasspath not allowed with target 1 9 Usage javac
  • 计算机硬件基础——第五章:指令系统(二)

    文章目录 指令 要求计算机执行特定操作的命令 是程序员智慧计算机工作的最小单位 指令系统 一台计算机全部指令的集合 也称为计算机指令集 80X86 CPU的常用指令 逻辑运算指令 用来对字或字节按位进行逻辑运算 逻辑与AND 指令 逻辑或O