文章目录
指令
要求计算机执行特定操作的命令,是程序员智慧计算机工作的最小单位
指令系统
一台计算机全部指令的集合
也称为计算机指令集
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的内部中断
-
无符号数除法
- 有符号数除法
-