1.控制转移指令
无条件转移指令
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
2.无条件转移指令
段内直接短转移:JMP SHORT OPR
执行操作:(IP) ← (IP) + 8位位移量
段内直接近转移:JMP NEAR PTR OPR
执行操作:(IP) ← (IP) + 16位位移量
段内间接转移: JMP WORD PTR OPR
执行操作: (IP) ← (EA)
段间直接远转移:JMP FAR PTR OPR
执行操作:(IP) ← OPR 的段内偏移地址
(CS) ← OPR 所在段的段地址
段间间接转移: JMP DWORD PTR OPR
执行操作: (IP) ← (EA)
(CS) ← (EA+2)
3.条件转移指令
注意:只能使用段内直接寻址的8 位位移量
3.1根据单个条件标志的设置情况转移
格式 | 测试条件 | ||
JZ(JE) OPR | ZF=1 | jump if zero,or equal 结果为零(或相等)则转移 |
|
JNZ(JNE) OPR | ZF=0 | ||
JS OPR | SF=1 | jump if sign 结果为负则转移 |
|
JNS OPR | SF=0 | ||
JO OPR | OF=1 | jump if overflow 结果溢出则转移 |
|
JNO OPR | OF=0 | ||
JP OPR | PF=1 | jump if parity,or parity even 奇偶为为1则转移 |
|
JNP OPR | PF=0 | ||
JB(JNAE,JC) OPR | CF=1 | 低于below, 或者不高于或者等于not above or equal, 或进位为1则转移carry |
|
JNB(JAE,JNC) OPR | CF=0 |
3.2比较两个无符号数,并根据比较结果转移*
* 适用于地址或双精度数低位字的比较
格式 测试条件
< JB (JNAE,JC) OPR CF = 1 jump if below (not above or equal , carry)
≥ JNB (JAE,JNC) OPR CF = 0 jump if not below ( above or equal , not carry)
≤ JBE (JNA) OPR CF∨ZF = 1 jump if below or equal (not above)
> JNBE (JA) OPR CF∨ZF = 0 jump if not below or equal (above)
3.3 比较两个带符号数,并根据比较结果转移*
* 适用于带符号数的比较
格式 测试条件
< JL (JNGE) OPR SF∀OF = 1 less, not greater or equal
≥ JNL (JGE) OPR SF∀OF = 0
≤ JLE (JNG) OPR (SF∀OF)∨ZF = 1 less or equal, not greater
> JNLE (JG) OPR (SF∀OF)∨ZF = 0
3.4 测试 CX 的值为 0 则转移
格式 测试条件
JCXZ OPR (CX)=0
3.循环指令
3.1概述
注意:
* CX 中存放循环次数
* 只能使用段内直接寻址的8 位位移量
LOOP
LOOPZ / LOOPE
LOOPNZ / LOOPNE
执行步骤:
(1) (CX) ← (CX) - 1
(2) 检查是否满足测试条件,
如满足则(IP) ← (IP) + 8位位移量,实行循环;
不满足则 IP 不变,退出循环。
3.2指令
循环指令:LOOP OPR
测试条件:(CX) ≠ 0
为零或相等时循环指令:LOOPZ(LOOPE) OPR
测试条件:ZF=1 且 (CX) ≠ 0
不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR
测试条件:ZF=0 且 (CX) ≠ 0
4.子程序调用和返回指令
4.1 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)
4.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
5.中断指令
5.1中断向量
中断例行程序的入口地址,存放于中断向量区。
5.2 中断指令: INT TYPE 或 INT
执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (FLAGS)
(SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (CS)
(SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← (TYPE*4)
(CS) ← (TYPE*4+2)
5.3 溢出中断指令:INTO
执行操作: 若OF=1,(SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (FLAGS)
(SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (CS)
(SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← (10H)
(CS) ← (12H)
5.4 从中断返回指令:IRET
执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
(CS) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
(FLAGS) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
注意:
* TYPE (0~255) 是中断类型号, 隐含的类型号为3
* INT 指令还把 IF 和 TF 置0,但不影响其它标志位
* IRET 指令执行完,标志位由堆栈中取出的值确定
来源:oschina
链接:https://my.oschina.net/u/4293666/blog/3494741