控制转移指令

JMPJ**JCXZLOOPCALLRET

 

JMP ( JuMP ) 无条件转移指令

名称

格式

执行操作

段内直接短跳转JMP    SHORT OPRIP=IP+8位偏移量
段内直接近转移JMP    NEAR PTR OPRIP=IP+16位偏移量
段内间接转移JMP    WORD PTR OPRIP=(EA)
段间直接转移JMP    FAR PTR OPRIP=OPR偏移地址,CS=OPR段地址
段间间接转移JMP    DWORD PTR OPRIP=(EA),CS=(EA+2)

1.无条件转移到指定的地址去执行从该地址开始的指令.

2.段内转移是指在同一代码段的范围内进行转移,只需改变IP寄存器内容.

3.段间转移则要转移到另一个代码段执行程序,此时要改变IP寄存器和CS段寄存器的内容.

 

 

条件转移指令根据上一条指令所设置的条件码(标志位)来判断测试条件.

根据五个标志位:ZFSFOF PF CF的两种状态(0 FALSE或1 TRUE)产生10种测试条件.

NameFlagFlag == TRUE [1]Flag ==FALSE [ 0]
Zero FalgZFJZ    OPR  //结果为零转移JNZ    OPR  //结果不为零转移
Sign FalgSFJS    OPR  //结果为负转移JNS    OPR  //结果为正转移
Overflow FlagOFJO   OPR  //溢出转移JNO   OPR  //不溢出转移
Parity FlagPFJP    OPR  //结果为偶转移JNP    OPR  //结果为奇转移
Carry FlagCFJC    OPR  //有进位转移JNC    OPR  //无进位转移

 

 

两个数比较:

情况无符号数有符号数
指令满足条件指令满足条件
A < BJCCF==1JLSF^OF==1 && ZF==0
A BJNCCF==0JNLSF^OF==0  ||  ZF==1
A BJNACF==1 || ZF==1JLGSF^OF==1  ||  ZF==1
A > BJACF==0 && ZF==0JGSF^OF==0 && ZF==0

 

测试CX转移指令

JCXZ    OPR          //CX==0时转移

 

 

LOOP(LOOP)循环指令

LOOP           OPR测试条件:CX 0               //OPR在程序中实际是个标号
LOOPZ        OPR测试条件:ZF == 1 && CX ≠ 0
LOOPNZ     OPR测试条件:ZF == 0 && CX ≠ 0

执行操作: 先执行CX=CX-1,再检测上面的测试条件,如满足则IP=IP+符号扩展的D8,不满足则退出循环.

 

 

过程调用及返回指令

CALL (CALL) 过程调用指令

CALL    DST            //DST在程序中实际是子程序标号

执行操作:先将过程的返回地址(即CALL的下一条指令的首地址)存入堆栈,然后转移到过程入口地址执行子程序.

调用方式格式断点保护入栈情况过程入口地址
段内直接CALL  NEAR  PTR  PR1(SP-1)(SP-2)IP , CS不进栈CS值保持不变,IPDST
段内间接CALL  WORD PTR  (EA)(SP-1)(SP-2)IP , CS不进栈CS值保持不变,IP(EA)
段间直接CALL  FAR  PTR  PR1(SP-1)(SP-2)CS , (SP-3)(SP-4)IPIP←DST偏移地址,CS←DST段地址
段间间接CALL  DWORD PTR  (EA)(SP-1)(SP-2)CS , (SP-3)(SP-4)IPIP←(EA),CS←(EA+2)

注:为了表明是段内调用,可使用NEAR PTR属性操作符作说明.

 

 

RET(RETurn)子程序返回指令

RET   

RET    EXP        //带立即数返回

子程序返回指令RET放在子程序末尾,它使子程序在执行完全部任务后返回主程序继续执行被打断后的程序.返回地址在子程序调用时入栈保存的断点地址-IP或IP和CS.

 
### 微机接口中的控制转移指令详解 #### 控制转移指令的作用 在微机系统中,控制转移指令用于改变程序执行顺序。这类指令允许处理器跳转到不同的内存地址继续执行代码,从而实现条件判断、循环结构等功能[^1]。 #### 常见的控制转移指令分类 常见的控制转移指令可以分为无条件转移和有条件转移两大类: - **无条件转移指令 (JMP)** 这种指令会立即将程序计数器(PC)设置为目标地址,使CPU从新位置开始取指并执行。无论当前状态如何,都会发生转移[^2]。 - **有条件转移指令** 只有当特定条件下成立时才会触发转移操作。这些条件通常基于算术逻辑单元(ALU)运算后的标志位来决定,比如零标志(ZF)、符号标志(SF)等。典型的有条件转移指令包括: - `JE/JZ` 当等于/零时跳跃 - `JNE/JNZ` 不等于/不为零时跳跃 - `JB` 小于(带借位) - `JA` 大于(不带借位) ```assembly ; 示例:使用有条件转移指令实现简单分支 CMP AX, BX ; 比较AX与BX寄存器的内容 JE equal_label ; 如果相等则跳转至equal_label标签处 ... ; 否则继续向下执行其他语句 equal_label: ; 定义一个名为equal_label的目标位置 ... ``` #### 影响因素及注意事项 - 执行时间取决于具体硬件架构; - 需要考虑目标地址的有效性和合法性; - 使用过多复杂的转移可能导致代码难以维护; 通过合理运用各种类型的控制转移指令,程序员能够编写出更加灵活多变的应用程序逻辑,在嵌入式开发等领域尤为重要[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值