反汇编:循环

#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;
}

你会发现汇编代码跟上面的是一样的!

posted @   zpchcbd  阅读(263)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示