8086/8088的指令系统包含了六种类型,其中数据传送指令14条,算术运算指令20条,逻辑运算指令13条,串操作指令10条,控制转移指令28条,处理器控制指令12条。
1)数据传送类指令(14条)
MOV: 传送
PUSH、POP:堆栈操作
XCHG:交换
IN、OUT:外设(端口)输入输出
XLAT:转换/换码/翻译 DS:[BX+AL]=>AL
LEA、LDS、LES:地址传送(计算)
PUSHF/POPF、LAHF/SAHF:标志传送
2)算术运算类指令指令(20条)
ADD、ADC、AAA、DAA: 加法
INC:加"1"
SUB、SBB、AAS、DAS: 减法
DEC:减"1"
CMP:比较;不修改被减数
NEG:求补指令;x=-x 等价于0-X
MUL、IMUL、AAM:乘法;
DIV、IDIV、AAD:除法
CBW、CWD、CDQ:累加器有符号扩展 linux CBTW、CWTD、CLTQ
MOVZX:无符号扩展
MOVSX:有符号扩展
3)逻辑运算指令(13条)-位操作指令
NOT: 求反
AND: 与、逻辑乘
OR: 或、逻辑加
XOR: 异或
TEST:位测试,同AND,不修改操作数
SHL、SHR、SAL、SAR:逻辑/算术移位
ROL、ROR、RCL、RCR:循环移位、带进位循环移位
4)串操作指令(10条) -数组操作指令
MOVSx: 串传送(拷贝) REP MOVS
CMPSx: 串比较 REPZ CMPS
SCASx: 串扫描(搜索某元素) REPNZ SCAS
LODSx: 取字符串(取数组某元素) LODS
STOSx: 存字符串(写数组某元素) (REP) STOS
注:串操作的四大准备: SI(源串地址)、DI(目的串地址)、CX(计数器)、DF(方向)
指令中的x可以取:B(1字节) W(2字节) D/L(4字节) Q(8字节)
5)控制转移类指令(28条)
CALL、RET: 子程序调用、返回
JMP:无条件转移指令
JZ/JNZ/JE/JNE、JC/JNC(CF位)、JO/JNO(OF位)、/JS/JNS、JP/JNP/JPE/JNPE:条件转移-按标志位转移指令
JA、JAE、JB、JBE:(above/below)条件转移-无符号数比较转移
JG、JGE、JL、JLE:(greater/lower)条件转移-有符号数比较转移
LOOP:循环 cx–, jnz L
LOOPE 、LOOPNE:条件循环
JCXZ:计数器CX==0转移
INT n:中断调用(BIOS/OS系统调用)
IRET:中断返回
INTO:溢出中断指令
由于地址是一个32位或64位的数,在转移时如果直接用绝对地址放到指令中,会导致指令的二进制编码很长,因此在实际中往往采用跳转的目的地址与跳转指令的下一条指令的地址的偏差作为跳转的目标。
其中,短转移: 偏差在-128~127之间
判断单个标志位状态
⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)
⑵JS和JNS:利用符号标志SF,判断结果是正是负
⑶JO和JNO:溢出标志OF,判断结果是否产生溢出
⑷JP/JPE和JNP/JPO:奇偶标志PF,判断结果中最低字节“1”的个数是偶是奇
⑸JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位
无符号数的大小用高(Above)低(Below)表示
利用CF确定高低、利用ZF标志确定相等(Equal)
两数的高低分成4种关系:
⑴低于(不高于等于):JB(JNAE)
⑵不低于(高于等于):JNB(JAE)
⑶低于等于(不高于):JBE(JNA)
⑷不低于等于(高于):JNBE(JA )
有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)
两数的大小分成4种关系:
⑴小于(不大于等于):JL(JNGE)
⑵不小于(大于等于):JNL(JGE)
⑶小于等于(不大于):JLE(JNG)
⑷不小于等于(大于):JNLE(JG)
6)处理机控制指令(12条)
CLC: CF=0
CMC: CF取反
STC: CF=1
STD: DF=1
CLD: DF=0
STI: IF=1
CLI: IF=0
HLT:处理机暂停
WAIT:等待状态(FPU异常同步)
ESC:将数据传送给FPU(浮点指令)
LOCK:保证总线的控制
NOP:无操作 同XCHG AX,AX 占1个时钟,1个字节。用于延时、预留指令等