反汇编-流程控制语句-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的开始语句,如果没有,就直接执行下一步的语句

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