无条件转移指令
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、IRETless
段内直接短转移:JMP SHORT OPR
执行操做:(IP) ← (IP) + 8位位移量post
段内直接近转移:JMP NEAR PTR OPR
执行操做:(IP) ← (IP) + 16位位移量测试
段内间接转移: JMP WORD PTR OPR
执行操做: (IP) ← (EA)spa
段间直接远转移:JMP FAR PTR OPR
执行操做:(IP) ← OPR 的段内偏移地址
(CS) ← OPR 所在段的段地址3d
段间间接转移: JMP DWORD PTR OPR
执行操做: (IP) ← (EA)
(CS) ← (EA+2)blog
3.条件转移指令get
注意:只能使用段内直接寻址的8 位位移量it
格式 | 测试条件 | ||
JZ(JE) OPR | ZF=1 | jump if zero,or equaltable 结果为零(或相等)则转移date |
|
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 |
* 适用于地址或双精度数低位字的比较
格式 测试条件
< 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)
* 适用于带符号数的比较
格式 测试条件
< 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
格式 测试条件
JCXZ OPR (CX)=0
注意:
* 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
段内直接近调用: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
执行操做: (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
中断例行程序的入口地址,存放于中断向量区。
执行操做: (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)
执行操做: 若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)
执行操做: (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 指令执行完,标志位由堆栈中取出的值肯定