反汇编:循环

#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
",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
",arr[i]);
	return true;
}

int main(){
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	toFor(arr,10);
	return 0;
}

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

原文地址:https://www.cnblogs.com/zpchcbd/p/12339791.html