控制转移指令

控制转移指令类似于高级语言中的控制语句。如:java中的if语句、for语句、while语句和break等语句。在汇编语言中使用goto和一些指令进行控制。

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)


时间是一切财富中最宝贵的财富。 —— 德奥弗拉斯多
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号