反汇编-流程控制语句-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)