本文共 1655 字,大约阅读时间需要 5 分钟。
C/C++中有三种循环语句,分别是do/while/for循环,具体的查看C/C++的语法书
MOVZX和MOVSX可以理解为MOV指令的变化,但是也有区别
MOVZX 操作数1,操作数2
MOVSX 操作数1,操作数2
操作数1必须是寄存器,操作数2可以是寄存器或者内存,但是不能是立即数
MOV指令是原值传送,两边数据宽度必须一致。
MOVSX A,B
MOVZX A,B
MOVSX、MOVZX的操作数B所占空间必须小于操作数A
将小存储单元的数据传送到大存储单元的数据。
MOVZX将小存储单元的数据移动到大存储单元的数据,未使用部分用0填充
MOVSX将小存储单元的数据移动到大存储单元的数据,未使用部分用数的符号位填充
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语句结束的地址
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里面赋值的话会多几个步骤
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)
转载地址:http://gxfkz.baihongyu.com/