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

指令

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

指令系统

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

也称为计算机指令集

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的内部中断
    • 无符号数除法

      • 有符号数除法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值