位置:海鸟网 > IT > ASP.NET >

一个简单程序的反编译

看了老赵的博客从汇编入手,探究泛型的性能问题 ,突然想起以前自己写过一个关于反汇编的文章,特转过来。

源代码如下:

以下为引用的内容:

void main(){

int a[3][3]={{1,1,1},{2,2,2},{3,3,3}};
int b[3][3]={{3,3,3},{2,2,2},{1,1,1}};
int c[3][3];
myfunction(a,b,c);
}

/*3*3 矩阵相乘*/
int myfunction(int a[3][3],int b[3][3],int c[3][3])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
c[i][j]=a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[i][2]*b[2][j];
printf("%d ",c[i][j]);
}
}
return 0;
}

在我的机器上,32位VS2008+32位VISTA汇编是,此时是debug未优化模式:

以下为引用的内容:

013810D0 /$ 55 push ebp 
013810D1 . 8BEC mov ebp, esp 
013810D3 . 83EC 6C sub esp, 6C
013810D6 . C745 DC 01000>mov dword ptr [ebp-24], 1
013810DD . C745 E0 01000>mov dword ptr [ebp-20], 1
013810E4 . C745 E4 01000>mov dword ptr [ebp-1C], 1
013810EB . C745 E8 02000>mov dword ptr [ebp-18], 2
013810F2 . C745 EC 02000>mov dword ptr [ebp-14], 2
013810F9 . C745 F0 02000>mov dword ptr [ebp-10], 2
01381100 . C745 F4 03000>mov dword ptr [ebp-C], 3
01381107 . C745 F8 03000>mov dword ptr [ebp-8], 3
0138110E . C745 FC 03000>mov dword ptr [ebp-4], 3;初始化数组a
01381115 . C745 B8 03000>mov dword ptr [ebp-48], 3
0138111C . C745 BC 03000>mov dword ptr [ebp-44], 3
01381123 . C745 C0 03000>mov dword ptr [ebp-40], 3
0138112A . C745 C4 02000>mov dword ptr [ebp-3C], 2
01381131 . C745 C8 02000>mov dword ptr [ebp-38], 2
01381138 . C745 CC 02000>mov dword ptr [ebp-34], 2
0138113F . C745 D0 01000>mov dword ptr [ebp-30], 1
01381146 . C745 D4 01000>mov dword ptr [ebp-2C], 1
0138114D . C745 D8 01000>mov dword ptr [ebp-28], 1;初始化数组b
01381154 . 8D45 94 lea eax, dword ptr [ebp-6C]
01381157 . 50 push eax;压入数组c的首地址
01381158 . 8D4D B8 lea ecx, dword ptr [ebp-48]
0138115B . 51 push ecx;压入数组b的首地址
0138115C . 8D55 DC lea edx, dword ptr [ebp-24]
0138115F . 52 push edx;压入数组a的首地址
01381160 . E8 9BFEFFFF call 01381000;调用函数myfunction
01381165 . 83C4 0C add esp, 0C
01381168 . 33C0 xor eax, eax
0138116A . 8BE5 mov esp, ebp
0138116C . 5D pop ebp
0138116D \. C3 retn

进入函数myfunction:

以下为引用的内容:

01381000 /$ 55 push ebp
01381001 . 8BEC mov ebp, esp
01381003 . 83EC 08 sub esp, 8
01381006 . 56 push esi
01381007 . 57 push edi
01381008 . C745 FC 00000>mov dword ptr [ebp-4], 0;i=0
0138100F . EB 09 jmp short 0138101A
01381011 > 8B45 FC /mov eax, dword ptr [ebp-4]
01381014 . 83C0 01 add eax, 1;i++
01381017 . 8945 FC mov dword ptr [ebp-4], eax
0138101A > 837D FC 03 cmp dword ptr [ebp-4], 3;i<3
0138101E . 0F8D 99000000 jge 013810BD
01381024 . C745 F8 00000>mov dword ptr [ebp-8], 0;j=0
0138102B . EB 09 jmp short 01381036
0138102D > 8B4D F8 /mov ecx, dword ptr [ebp-8]
01381030 . 83C1 01 add ecx, 1;j++
01381033 . 894D F8 mov dword ptr [ebp-8], ecx
01381036 > 837D F8 03 cmp dword ptr [ebp-8], 3;j<3
0138103A . 7D 7C jge short 013810B8
0138103C . 8B55 FC mov edx, dword ptr [ebp-4] ;取i值
0138103F . 6BD2 0C imul edx, edx, 0C;计算a[i][0]的偏移量
01381042 . 8B45 08 mov eax, dword ptr [ebp+8];取a的首地址
01381045 . 8B4D F8 mov ecx, dword ptr [ebp-8];取j值
01381048 . 8B75 0C mov esi, dword ptr [ebp+C];取b的首地址
0138104B . 8B1410 mov edx, dword ptr [eax+edx];取a[i][0] 的值,首地址加偏移
0138104E . 0FAF148E imul edx, dword ptr [esi+ecx*4];取b[0][j]的值,并将 a[i][0]*b[0][j]的计算结果存入edx
01381052 . 8B45 FC mov eax, dword ptr [ebp-4]
01381055 . 6BC0 0C imul eax, eax, 0C
01381058 . 8B4D 08 mov ecx, dword ptr [ebp+8]
0138105B . 8B75 F8 mov esi, dword ptr [ebp-8]
0138105E . 8B7D 0C mov edi, dword ptr [ebp+C]
01381061 . 8B4401 04 mov eax, dword ptr [ecx+eax+4];取a[i][1]的值,偏移+4
01381065 . 0FAF44B7 0C imul eax, dword ptr [edi+esi*4+C]取b[1][j]的值,偏移+12,结果存eax
0138106A . 03D0 add edx, eax;计算前两步加法结果
0138106C . 8B4D FC mov ecx, dword ptr [ebp-4]
0138106F . 6BC9 0C imul ecx, ecx, 0C
01381072 . 8B45 08 mov eax, dword ptr [ebp+8]
01381075 . 8B75 F8 mov esi, dword ptr [ebp-8]
01381078 . 8B7D 0C mov edi, dword ptr [ebp+C]
0138107B . 8B4C08 08 mov ecx, dword ptr [eax+ecx+8];取a[i][2]
0138107F . 0FAF4CB7 18 imul ecx, dword ptr [edi+esi*4+18]取a[2][j],计算第3个乘法
01381084 . 03D1 add edx, ecx;循环一次的最终计算结果存在edx
01381086 . 8B45 FC mov eax, dword ptr [ebp-4]
01381089 . 6BC0 0C imul eax, eax, 0C
0138108C . 0345 10 add eax, dword ptr [ebp+10];取c的首地址
0138108F . 8B4D F8 mov ecx, dword ptr [ebp-8]
01381092 . 891488 mov dword ptr [eax+ecx*4], edx赋值给c[i][j]
01381095 . 8B55 FC mov edx, dword ptr [ebp-4]
01381098 . 6BD2 0C imul edx, edx, 0C
0138109B . 0355 10 add edx, dword ptr [ebp+10]
0138109E . 8B45 F8 mov eax, dword ptr [ebp-8]
013810A1 . 8B0C82 mov ecx, dword ptr [edx+eax*4];取出c[i][j],准备printf()
013810A4 . 51 push ecx ; /<%d>
013810A5 . 68 F4203801 push 013820F4 ; format = "%d "
013810AA . FF15 A0203801 call dword ptr [<&MSVCR90.printf>] ; \printf
013810B0 . 83C4 08 add esp, 8
013810B3 .^ E9 75FFFFFF \jmp 0138102D
013810B8 >^ E9 54FFFFFF \jmp 01381011
013810BD > 33C0 xor eax, eax
013810BF . 5F pop edi
013810C0 . 5E pop esi
013810C1 . 8BE5 mov esp, ebp
013810C3 . 5D pop ebp
013810C4 \. C3 retn

比较容易就能看懂,下面是MAXIMIZE SPEED优化:

以下为引用的内容:

[1] [2] [3] 下一页