博客
关于我
反汇编-流程控制语句-2-循环控制语句分析
阅读量:398 次
发布时间:2019-03-06

本文共 1655 字,大约阅读时间需要 5 分钟。

反汇编-流程控制语句-2-循环控制语句分析

C/C++中有三种循环语句,分别是do/while/for循环,具体的查看C/C++的语法书

MOVZX、MOVSX指令

MOVZX和MOVSX可以理解为MOV指令的变化,但是也有区别

MOVZX 操作数1,操作数2

MOVSX 操作数1,操作数2

操作数1必须是寄存器,操作数2可以是寄存器或者内存,但是不能是立即数

MOVZX、MOVSX与MOV指令的区别

MOV指令是原值传送,两边数据宽度必须一致。

MOVSX A,B

MOVZX A,B

MOVSX、MOVZX的操作数B所占空间必须小于操作数A

将小存储单元的数据传送到大存储单元的数据。

MOVSX和MOVZX的区别

MOVZX将小存储单元的数据移动到大存储单元的数据,未使用部分用0填充

MOVSX将小存储单元的数据移动到大存储单元的数据,未使用部分用数的符号位填充

循环语句分析

while

int a = 3; 00413C03  mov         dword ptr [a],3       while (a > 0) 00413C0A cmp dword ptr [a],0 00413C0E jle LoopTest+4Bh (0413C1Bh) { a--; 00413C10 mov eax,dword ptr [a] 00413C13 sub eax,1 00413C16 mov dword ptr [a],eax } 00413C19 jmp LoopTest+3Ah (0413C0Ah)

while循环,首先将条件进行比较,然后取比较的结果的反的JCC跳转,比如这里的a>3,就采用jle左边小于等于右边就跳转到while语句结束的地址

for

int c = 0; 00413BD9  mov         dword ptr [c],0       for (int i = 0; i < 3; i++) 00413BE0 mov dword ptr [ebp-8],0 00413BE7 jmp LoopTest+22h (0413BF2h) 00413BE9 mov eax,dword ptr [ebp-8] 00413BEC add eax,1 00413BEF mov dword ptr [ebp-8],eax 00413BF2 cmp dword ptr [ebp-8],3 00413BF6 jge LoopTest+33h (0413C03h) { c++; 00413BF8 mov eax,dword ptr [c] 00413BFB add eax,1 00413BFE mov dword ptr [c],eax } 00413C01 jmp LoopTest+19h (0413BE9h)

for循环比较复杂,首先进行赋值,然后跳转到条件比较,同样比较后进行反向的JCC跳转,如果没有跳转就执行for里面的语句,然后再跳转到自增运算里面。这里比较复杂的就是如果在for里面赋值的话会多几个步骤

do-while

int b = 0; 00413C1B  mov         dword ptr [b],0       do { b++; 00413C22 mov eax,dword ptr [b] 00413C25 add eax,1 00413C28 mov dword ptr [b],eax } while (b < 3); 00413C2B cmp dword ptr [b],3 00413C2F jl LoopTest+52h (0413C22h)

先直接指向dowhile里面的语句,然后再在执行完直接跳转但是这里不一样,这里是正向跳转,比如这里的b<3,如果b<3直接跳转到dowhile的开始语句,如果没有,就直接执行下一步的语句

循环的特征:如果是在下面,会有一个往上的跳转,如果是在上面判断,会有一个往下的跳转

转载地址:http://gxfkz.baihongyu.com/

你可能感兴趣的文章
《非暴力沟通》总结
查看>>
《你当像鸟飞往你的山》总结
查看>>
《我是猫》总结
查看>>
《抗糖化书》总结
查看>>
apache虚拟主机配置
查看>>
光盘作为yum源
查看>>
PHP 正则表达式资料
查看>>
PHP官方网站及PHP手册
查看>>
mcrypt加密以及解密过程
查看>>
mysql连续聚合
查看>>
go等待N个线程完成操作总结
查看>>
消息队列 RocketMQ 并发量十万级
查看>>
ReactJs入门教程-精华版
查看>>
乐观锁悲观锁应用
查看>>
Window环境下安装Redis 并 自启动Redis 及 Redis Desktop Manager
查看>>
简单说说TCP三次握手、四次挥手机制
查看>>
.net Core 使用IHttpClientFactory请求
查看>>
多线程之旅(准备阶段)
查看>>
Python 之网络式编程
查看>>
MySql5.5安装步骤及MySql_Front视图配置
查看>>