数组的反汇编

一维数组

#include "stdafx.h"

  void  test1()
  {
	  int s[5]={0};
	  int i=0;
	  while (i<5)
	  {
		  s[i]=i;
		  i++;
	  }
	  int a=s[3];
  }
  
int _tmain(_In_ int _Argc,char* _In_reads_)
{	
	

	test1();

	
	return 0;
}

反汇编里查看test函数

     8: 	  int s[5]={0};
004113F8 C7 45 E4 00 00 00 00 mov         dword ptr [ebp-1Ch],0  
004113FF 33 C0                xor         eax,eax  
00411401 89 45 E8             mov         dword ptr [ebp-18h],eax  
00411404 89 45 EC             mov         dword ptr [ebp-14h],eax  
00411407 89 45 F0             mov         dword ptr [ebp-10h],eax  
0041140A 89 45 F4             mov         dword ptr [ebp-0Ch],eax//这几句表明	  int s[5]={0}; 这样写编译器会给这个数组初始化为0
     9: 	  int i=0;
0041140D C7 45 D8 00 00 00 00 mov         dword ptr [ebp-28h],0  
    10: 	  while (i<5)
00411414 83 7D D8 05          cmp         dword ptr [ebp-28h],5  
00411418 7D 15                jge         0041142F  
    11: 	  {
    12: 		  s[i]=i;
0041141A 8B 45 D8             mov         eax,dword ptr [ebp-28h]  
0041141D 8B 4D D8             mov         ecx,dword ptr [ebp-28h]   
00411420 89 4C 85 E4          mov         dword ptr [ebp+eax*4-1Ch],ecx  //ebp-1ch为数组最开始的位置。
    13: 		  i++;
00411424 8B 45 D8             mov         eax,dword ptr [ebp-28h]  
00411427 83 C0 01             add         eax,1  
0041142A 89 45 D8             mov         dword ptr [ebp-28h],eax  
    14: 	  }
0041142D EB E5                jmp         00411414  
    15: 	  int a=s[3];
0041142F B8 04 00 00 00       mov         eax,4  
00411434 6B C0 03             imul        eax,eax,3  
00411437 8B 4C 05 E4          mov         ecx,dword ptr [ebp+eax-1Ch]  
0041143B 89 4D CC             mov         dword ptr [ebp-34h],ecx  
    16:   }
0041143E 52                   push        edx  
0041143F 8B CD                mov         ecx,ebp  
00411441 50                   push        eax  
00411442 8D 15 60 14 41 00    lea         edx,ds:[00411460h]  
00411448 E8 44 FC FF FF       call        00411091  
0041144D 58                   pop         eax  
0041144E 5A                   pop         edx  
0041144F 5F                   pop         edi  
00411450 5E                   pop         esi  
00411451 5B                   pop         ebx  
00411452 8B 4D FC             mov         ecx,dword ptr [ebp-4]  
00411455 33 CD                xor         ecx,ebp  
00411457 E8 C2 FB FF FF       call        0041101E  
    16:   }
0041145C 8B E5                mov         esp,ebp  
0041145E 5D                   pop         ebp  
0041145F C3                   ret  


二维数组

#include "stdafx.h"

  void  test1()
  {
	  int s[2][3]={1,2,3,4,5,6};
	  int a=s[1][2];
  }
  
int _tmain(_In_ int _Argc,char* _In_reads_)
{	
	

	test1();

	
	return 0;
}

查看反汇编

     8: 	  int s[2][3]={1,2,3,4,5,6};
004113EE C7 45 E4 01 00 00 00 mov         dword ptr [ebp-1Ch],1     //在这里给数组赋值
004113F5 C7 45 E8 02 00 00 00 mov         dword ptr [ebp-18h],2  
004113FC C7 45 EC 03 00 00 00 mov         dword ptr [ebp-14h],3  
00411403 C7 45 F0 04 00 00 00 mov         dword ptr [ebp-10h],4  
0041140A C7 45 F4 05 00 00 00 mov         dword ptr [ebp-0Ch],5  
00411411 C7 45 F8 06 00 00 00 mov         dword ptr [ebp-8],6  
     9: 	  int a=s[1][2];
00411418 B8 0C 00 00 00       mov         eax,0Ch  
0041141D C1 E0 00             shl         eax,0   //eax=12  寻找在哪一行
00411420 8D 4C 05 E4          lea         ecx,[ebp+eax-1Ch]  
00411424 BA 04 00 00 00       mov         edx,4  
00411429 D1 E2                shl         edx,1  //找到所在行的哪一个位置    两次定位
0041142B 8B 04 11             mov         eax,dword ptr [ecx+edx]  
0041142E 89 45 D8             mov         dword ptr [ebp-28h],eax  
    10:   }

猜你喜欢

转载自blog.csdn.net/qq_41490873/article/details/86601236