控制转移指令

  • Post author:
  • Post category:其他




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段寄存器的内容.





条件转移指令




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

根据五个标志位:

ZF



SF



OF



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

值保持不变,

IP



DST


段内间接

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.