1、无条件转移指令
短转移 JMP SHORT label (short jump)
指令的汇编格式:JMP SHORT label
指令的基本功能:(IP)<-当前(IP)+8位位移量 8位位移量是汇编程序在汇编源程序时,根据目标地址和当前IP之间的距离自动生成的。
指令对条件码的影响:对标志位无影响。
近转移 JMP NEAR PTR label (near jump)
指令的汇编格式:直接转移 JMP label (direct jump)
寄存器间接转移 JMP reg (register indirect jump)
存储器间接转移 JMP WORD PTR OPR (memory indirect jump)
指令的基本功能:JMP label (IP) <- OFFSET label = (IP)当前+16位位移量
JMP reg (IP) <- (reg)
JMP WORD PTR OPR (IP) <- (PA+1,PA)
指令支持的寻址方式:指令中的转向地址可以是直接寻址方式、寄存器寻址方式、寄存器间接寻址方式和存储器寻址方式。
指令对条件码的影响:对标志位无影响。
远转移 JMP FAR PTR label (for jump)
指令的汇编格式:JMP FAR PTR label
指令的基本功能:(IP)<-label的段内偏移地址
(CS)<-label所在段的段地址
指令支持的寻址方式:远转移的目的地址可以使用除立即寻址方式外的任何寻址方式来表示。
指令对条件码的影响:对标志位无影响。
2、条件转移指令
指令的汇编格式及功能
根据条件码的值转移:
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 SF异或OF=0 被减数不小于减数则转移
JLE/JNE (SF异或OF)与ZF=1 被减数不大于减数则转移
JNLE/JG (SF异或OF)与ZF=0 被减数大于减数则转移
根据CX寄存器的值转移
JCXZ (CX)=0 CX内容为零 则转移
指令的特殊要求:所有条件转移指令都是短转移指令,转移的目标地址必须在当前IP地址的-128至+127字节范围之内,因此条件转移指令是2字节指令。
3、循环指令
循环 LOOP (loop)
指令的汇编格式:LOOP label
指令的基本功能:① (CX)←(CX)-1
② 若(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。
指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。
为零/相等时循环 LOOPZ/LOOPE (loop while nonzero or equal)
指令的汇编格式:LOOPNZ/LOOPNE label
指令的基本功能:① (CX)←(CX)-1
② 若ZF=1且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。
指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。
不为零/不相等时循环 LOOPNZ/LOOPNE (loop while nonzero or not equal)
指令的汇编格式:LOOPNZ/LOOPNE label
指令的基本功能:① (CX)←(CX)-1
② 若ZF=0且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。
指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。
3、子程序调用
段内直接近调用 CALL SUBROUT
指令的基本功能:(SP)<-(SP)-2
((SP)+1,(sp))<-(IP)
(IP)<-(IP)+16位位移量
段内间接近调用 CALL DESTIN
指令的基本功能:(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(EA)
段间直接调用 CALL FAR PTR SUBROUT
指令的基本功能:(SP)<-(SP)-2,((SP))<-(CS)当前
(SP)<-(SP)-2,((SP))<-(IP)当前
(IP)<-偏移地址(在指令的第2、3个字节)
(CS)<-段地址(在指令的第4、5个字节)
5、返回指令
段内返回(近返回) RET
指令的基本功能:(IP)<-((SP)+1,(SP))
(SP)<-(SP)+2
段间返回(远返回) RET
指令的基本功能:(IP)<-((SP)),(SP)<-(SP)+2
(CS)<-((SP)),(SP)<-(SP)+2
带立即数返回 RET N
执行操作:① 返回地址出栈(操作同段内或段间返回)
② 修改堆栈指针:(SP) ← (SP)+N
6、中断及中断返回指令
INT n 中断指令(interrupt),n为中断类型号
执行操作:① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
(SP) ← (SP)-2,((SP)) ← (IP)
③ 转中断处理程序:(IP) ← (n×4)
(CS) ← (n×4+2)
IRET 中断返回指令(return from interrupt)
执行操作:① 返回地址出栈:(IP) ← ((SP)),(SP) ← (SP)+2
(CS) ← ((SP)),(SP) ← (SP)+2
② FLAGS出栈:(FLAGS) ← ((SP)),(SP) ← (SP)+2
INTO 溢出则中断(中断类型为4)
执行操作:若OF=1(有溢出),则:
① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
(SP) ← (SP)-2,((SP)) ← (IP)
③ 转中断处理程序:(IP) ← (4×4)= (10H)
(CS) ← (4×4+2)= (12H)