1.do...while
do..while语句反汇编 :
DO_BEGIN地址:
影响标志位的指令
jxx DO_BEGIN
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/652a85570122cc79222efab9e37e5081.png)
总结:
1、根据条件跳转指令所跳转到的地址,可以得到循环语句块的起始地址。
2、根据条件跳转指令所在的地址,可以得到循环语句块的结束地址。
3、条件跳转的逻辑与源码相同。
2.while语句
while语句反汇编:
WHILE_BEGIN:
影响标志位的指令
jxx WHILE_END ;条件成立跳转到循环语句块结尾处
......
jmp WHILE_BEGIN ;跳转到条件比较处
WHILE_END:
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/c7c28672f8afd3a226022b56f04fd03a.png)
总结:
1、根据条件跳转指令所跳转到的地址,可以得到循环语句块的结束地址;
2、根据jmp 指令所跳转到的地址,可以得到循环语句块的起始地址;
3、在还原while 比较时,条件跳转的逻辑与源码相反。
3.for语句
![](https://i-blog.csdnimg.cn/blog_migrate/346744a55bc7a390204537bcbbe47f72.png)
总结:
1、第一个jmp 指令之前为赋初值部分.
2、第一个jmp 指令所跳转的地址为循环条件判定部分起始.
3、判断条件后面的跳转指令条件成立时跳转到循环体外面
4、条件判断跳转指令所指向的地址上面有一个jmp;该jmp地址为表达式3的起始位置