| #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; |
| } |
你会发现汇编代码跟上面的是一样的!

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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