控制转移指令的步骤
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.
本文地址:http://www.45fan.com/a/question/73060.html