80x86的指令系统(二)

时间:2022-05-20 01:12:57

1、逻辑指令:
逻辑运算指令
AND、OR、NOT、XOR、TEST
移位指令
SHL、SHR 、 SAL 、SAR、
ROL、ROR、RCL、RCR

2、逻辑运算指令
逻辑非指令:NOT OPR
执行操作: (OPR) <— (OPR)
* 不影响标志位
* OPR不能为立即数
逻辑与指令:AND DST, SRC
执行操作: (DST) <— (DST) ∧ (SRC)
逻辑或指令:OR DST, SRC
执行操作: (DST) <— (DST)∨ (SRC)
异或指令: XOR DST, SRC
执行操作: (DST) <— (DST) ⊕ (SRC)
测试指令: TEST OPR1, OPR2
执行操作: (OPR1) ∧ (OPR2)

3、移位指令
逻辑左移 SHL OPR, CNT
逻辑右移 SHR OPR, CNT
算术左移 SAL OPR, CNT(同逻辑左移)
算术右移 SAR OPR, CNT
循环左移 ROL OPR, CNT
循环右移 ROR OPR, CNT
带进位循环左移 RCL OPR, CNT
带进位循环右移 RCR OPR, CNT
注意:
* OPR可用除立即数以外的任何寻址方式
* CNT=1,SHL OPR, 1
CNT>1,MOV CL, CNT
SHL OPR, CL
; 以SHL为例
* 条件标志位:
CF = 移入的数值
OF:
1 CNT=1时,最高有效位的值发生变化
0 CNT=1时,最高有效位的值不变
移位指令:
SF、ZF、PF 根据移位结果设置,AF无定义
循环移位指令:
不影响 SF、ZF、PF、AF

4、串处理指令
设置方向标志指令
CLD、STD
串处理指令
MOVSB / MOVSW
STOSB / STOSW
LODSB / LODSW
CMPSB / CMPSW
SCASB / SCASW
串重复前缀
REP
REPE / REPZ
REPNE / REPNZ

与 REP 配合工作的 MOVS / STOS / LODS
REP
执行操作:
(1) 如 (CX)=0 则退出 REP,否则转(2)
(2) (CX) <— (CX) -1
(3) 执行 MOVS / STOS / LODS
(4) 重复 (1) ~ (3)

MOVS 串传送指令:
MOVS DST, SRC
MOVSB (字节)
MOVSW (字)
REP MOVS:
将数据段中的整串数据传送到附加段中。
源串(数据段)→ 目的串(附加段)
执行 REP MOVS 之前,应先做好:
(1) 源串首地址(末地址)→ SI
(2) 目的串首地址(末地址)→ DI
(3) 串长度 → CX
(4) 建立方向标志
( CLD 使 DF=0,STD 使 DF=1 )

STOS 存入串指令:
STOS DST
STOSB (字节)
STOSW (字)
执行操作:
字节操作:((DI))←(AL), (DI)←(DI)±1
字操作:((DI))←(AX), (DI)←(DI)±2

LODS 从串取指令:
LODS SRC
LODSB (字节)
LODSW (字)
执行操作:
字节操作:(AL)←((SI)), (SI)←(SI)±1
字操作:(AX)←((SI)), (SI)←(SI)±2
注意:
* LODS 指令一般不与 REP 联用
* 源串一般在数据段中(允许使用段跨越前缀来修改),
目的串必须在附加段中
* 不影响条件标志位

与 REPE / REPZ(REPNE / REPNZ)配合工作的
CMPS 和 SCAS

REPE / REPZ
REPNE / REPNZ

执行操作:
(1) 如 (CX)=0 或 ZF=0 (ZF=1) 则退出串操作,否则转(2)
(2) (CX)←(CX) -1
(3) 执行 CMPS / SCAS
(4) 重复 (1) ~ (3)

CMPS 串比较指令:
CMPS SRC, DST
CMPSB (字节)
CMPSW (字)
执行操作:
(1) ((SI)) - ((DI))
根据比较结果置条件标志位:相等 ZF=1 不等 ZF=0
(2) 字节操作:(SI)←(SI)±1, (DI)←(DI)±1
字操作: (SI)←(SI)±2, (DI)←(DI)±2

SCAS 串扫描指令:
SCAS DST
SCASB (字节)
SCASW (字)

执行操作:
字节操作:(AL) - ((DI)), (DI)←(DI)±1
字操作: (AX) - ((DI)), (DI)←(DI)±2

5、控制转移指令:
无条件转移指令
JMP
条件转移指令
JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、
JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、
JLE / JNLE、 JCXZ
循环指令
LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE
子程序调用和返回指令
CALL、RET
中断与中断返回指令
INT、INTO、IRET

条件转移指令:
根据单个条件标志的设置情况转移

格式 格式 测试条件
JZ(JE) OPR ZF = 1
JNZ(JNE) OPR ZF = 0
JS OPR SF = 1
JNS OPR SF = 0
JO OPR OF = 1
JNO OPR OF = 0
JP OPR PF = 1
JNP OPR PF = 0
JC OPR CF = 1
JNC OPR CF = 0

比较两个无符号数,并根据比较结果转移

格式 格式 测试条件
JB (JNAE,JC) OPR CF = 1
JNB (JAE,JNC) OPR CF = 0
JBE (JNA) OPR CF∨ZF = 1
JNBE (JA) OPR CF∨ZF = 0

比较两个带符号数,并根据比较结果转移

格式 格式 测试条件
JL (JNGE) OPR SF⊕OF = 1
JNL (JGE) OPR SF⊕OF=0
JLE (JNG) OPR (SF⊕OF)∨ZF=1
JNLE (JG) OPR (SF⊕OF)∨ZF=0

测试 CX 的值为 0 则转移

格式 格式 测试条件
JCXZ OPR (CX)=0

6、循环指令
注意:
* CX 中存放循环次数
* 只能使用段内直接寻址的8 位位移量
LOOP
LOOPZ / LOOPE
LOOPNZ / LOOPNE
执行步骤:
(1) (CX) ← (CX) - 1
(2) 检查是否满足测试条件,如满足则
(IP) ← (IP) + 8位位移量,实行循环;
不满足则 IP 不变,退出循环。
循环指令:LOOP OPR
测试条件:(CX) ≠0

为零或相等时循环指令:LOOPZ(LOOPE) OPR
测试条件:ZF=1 且 (CX) ≠ 0

不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR
测试条件:ZF=0 且 (CX) ≠ 0

7、子程序调用和返回指令:
CALL 调用指令
段内直接近调用:CALL DST
执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← (IP) + 16位位移量
段内间接近调用:CALL DST
执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← (EA)
段间直接远调用:CALL DST
执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (CS)
(SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← 偏移地址
(CS) ← 段地址
段间间接远调用:CALL DST
执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (CS)
(SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← (EA)
(CS) ← (EA+2)

RET 返回指令
段内近返回:RET
执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
段内带立即数近返回:RET EXP
段间远返回:RET
执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
(CS) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
段间带立即数远返回:RET EXP

8、中断指令
中断指令: INT TYPE 或 INT
溢出中断指令:INTO
从中断返回指令:IRET

9、处理机控制与杂项操作指令
标志处理指令
CLC、 STC、 CMC、
CLD、STD、
CLI、STI
其他处理机控制与杂项操作指令
NOP、HLT、WAIT、ESC、LOCK