反汇编:循环
#include<stdio.h>
int main(){
for(int i=0;i<10;i++)
printf("%d",i);
return 0;
}
00401010 >|> \55 PUSH EBP
00401011 |. 8BEC MOV EBP,ESP
00401013 |. 83EC 44 SUB ESP,44
00401016 |. 53 PUSH EBX
00401017 |. 56 PUSH ESI
00401018 |. 57 PUSH EDI
00401019 |. 8D7D BC LEA EDI,DWORD PTR SS:[EBP-44]
0040101C |. B9 11000000 MOV ECX,11
00401021 |. B8 CCCCCCCC MOV EAX,CCCCCCCC
00401026 |. F3:AB REP STOS DWORD PTR ES:[EDI]
00401028 |. C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
0040102F |. EB 09 JMP SHORT dia.0040103A
00401031 |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] ; 把变量的值赋值给eax
00401034 |. 83C0 01 |ADD EAX,1 ; eax 加1
00401037 |. 8945 FC |MOV DWORD PTR SS:[EBP-4],EAX ; +1处理后 赋值给原来存储变量的地址
0040103A |> 837D FC 0A CMP DWORD PTR SS:[EBP-4],0A ; 判断次数是否有10次
0040103E |. 7D 13 |JGE SHORT dia.00401053 ; 如果当前变量的值等于A
00401040 |. 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4] ; 变量的值 赋值给 ecx
00401043 |. 51 |PUSH ECX ; /<%d>
00401044 |. 68 1C204200 |PUSH OFFSET dia.??_C@_02MHAC@?$CFp?$AA@ ; |format = "%d"
00401049 |. E8 22000000 |CALL dia.printf ; \printf
0040104E |. 83C4 08 |ADD ESP,8 ; 栈顶下降
00401051 |.^ EB DE \JMP SHORT dia.00401031
函数数组循环:
#include<stdio.h>
bool toFor(int arr[],int n){
for(int i=0;i<n;i++)
printf("%d\n",arr[i]);
return true;
}
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
toFor(arr,10);
return 0;
}
00401038 |. C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 ; 把0赋值给 一个地址指向的值
0040103F |. EB 09 JMP SHORT dia.0040104A ; 跳转
00401041 |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] ; 把当前变量的值赋值给eax
00401044 |. 83C0 01 |ADD EAX,1 ; 变量递增1
00401047 |. 8945 FC |MOV DWORD PTR SS:[EBP-4],EAX ; 改变当前变量的值,值为eax
0040104A |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; 把当前的值赋值给ecx,ecx是用来存储次数的,这里我代码写的不好,计数的时候和变量的值是一样的,比较容易混淆
0040104D |. 3B4D 0C |CMP ECX,DWORD PTR SS:[EBP+C] ; 比较次数是否为A
00401050 |. 7D 19 |JGE SHORT dia.0040106B ; 如果为A的话 则跳出循环
00401052 |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4] ; 将当前存储的变量赋值给edx
00401055 |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] ; 存储的第一个变量中的值赋值给eax
00401058 |. 8B0C90 |MOV ECX,DWORD PTR DS:[EAX+EDX*4] ; 递增eax的地址,准备处理下一个地址中的变量
0040105B |. 51 |PUSH ECX ; /<%d>
0040105C |. 68 1C204200 |PUSH OFFSET dia.??_C@_03HMFC@?$CFd?6?$A>; |format = "%d
"
00401061 |. E8 DA000000 |CALL dia.printf ; \printf
00401066 |. 83C4 08 |ADD ESP,8 ; 降低栈顶,因为当前堆栈的地址已经没用了,需要降低
00401069 |.^ EB D6 \JMP SHORT dia.00401041
0040106B |> B0 01 MOV AL,1
0040106D |. 5F POP EDI
0040106E |. 5E POP ESI
0040106F |. 5B POP EBX
00401070 >|. 83C4 44 ADD ESP,44
00401073 |. 3BEC CMP EBP,ESP
00401075 |. E8 46010000 CALL dia.__chkesp
0040107A |. 8BE5 MOV ESP,EBP
0040107C |. 5D POP EBP
0040107D \. C3 RETN
函数数组指针循环:
#include<stdio.h>
bool toFor(int* arr,int n){
for(int i=0;i<n;i++)
printf("%d\n",arr[i]);
return true;
}
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
toFor(arr,10);
return 0;
}
你会发现汇编代码跟上面的是一样的!