控制转移指令

JMP J** JCXZ LOOP CALL RET

 

JMP ( JuMP ) 无条件转移指令

名称

格式

执行操作

段内直接短跳转 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)

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

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

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

 

 

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

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

Name Flag Flag == TRUE [1] Flag ==FALSE [ 0]
Zero Falg ZF JZ    OPR  //结果为零转移 JNZ    OPR  //结果不为零转移
Sign Falg SF JS    OPR  //结果为负转移 JNS    OPR  //结果为正转移
Overflow Flag OF JO   OPR  //溢出转移 JNO   OPR  //不溢出转移
Parity Flag PF JP    OPR  //结果为偶转移 JNP    OPR  //结果为奇转移
Carry Flag CF JC    OPR  //有进位转移 JNC    OPR  //无进位转移

 

 

两个数比较:

情况 无符号数 有符号数
指令 满足条件 指令 满足条件
A < B JC CF==1 JL SF^OF==1 && ZF==0
A B JNC CF==0 JNL SF^OF==0  ||  ZF==1
A B JNA CF==1 || ZF==1 JLG SF^OF==1  ||  ZF==1
A > B JA CF==0 && ZF==0 JG SF^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)IP IP←DST偏移地址,CS←DST段地址
段间间接 CALL  DWORD PTR  (EA) (SP-1)(SP-2)CS , (SP-3)(SP-4)IP IP←(EA),CS←(EA+2)

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

 

 

RET(RETurn)子程序返回指令

RET   

RET    EXP        //带立即数返回

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

 

你可能感兴趣的:(汇编基础)