-
-
[求助]一段反汇编有点没看懂
-
发表于:
2014-7-22 10:34
3613
-
int myfunction(int a[3][3],int b[3][3],int c[3][3])
{
int i,j;
for(i=0;i<3;i++)
00401000 mov eax,dword
ptr
[esp+4]
;a
保存到
eax
中
00401004 mov edx,dword
ptr
[esp+0Ch]
;c
保存到
edx
中
00401008 mov ecx,dword
ptr
[esp+8]
;b
保存到
ecx
中。
0040100C push ebx
0040100D push esi
0040100E add eax,4 (这里是问题,为什么要eax+4?以及下面的edx+8?)
;
这里已经开始处理数据。必须把这些指令和
;
函数入口指令和循环控制指令分开
00401011 push edi
00401012 add edx,8
;
同前面的
add eax,4
00401015 mov esi,3
;
循环变量取
3
0040101A lea ebx,[ebx]
;
无意义指令
{
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];
00401020 mov ebx,dword
ptr
[eax]
;
显然从这里开始
,
是数值计算过程。代码的优化,使内部
00401022 imul ebx,dword
ptr
[ecx+0Ch]
;
循环不见了。可以数一下
imul
指令,刚好九次。可以说明
00401026 mov edi,dword
ptr
[ecx+18h]
;
这里用一个单循环完成了原来双循环的工作。
00401029 imul edi,dword
ptr
[eax+4]
0040102D add edi,ebx
0040102F mov ebx,dword
ptr
[eax-4]
00401032 imul ebx,dword
ptr
[ecx]
00401035 add edi,ebx
00401037 mov dword
ptr
[edx-8],edi
0040103A mov ebx,dword
ptr
[eax]
0040103C imul ebx,dword
ptr
[ecx+10h]
00401040 mov edi,dword
ptr
[ecx+1Ch]
00401043 imul edi,dword
ptr
[eax+4]
00401047 add edi,ebx
00401049 mov ebx,dword
ptr
[eax-4]
0040104C imul ebx,dword
ptr
[ecx+4]
00401050 add edi,ebx
00401052 mov dword
ptr
[edx-4],edi
00401055 mov ebx,dword
ptr
[eax+4]
00401058 imul ebx,dword
ptr
[ecx+20h]
0040105C mov edi,dword
ptr
[ecx+14h]
0040105F imul edi,dword
ptr
[eax]
00401062 add edi,ebx
00401064 mov ebx,dword
ptr
[eax-4]
00401067 imul ebx,dword
ptr
[ecx+8]
0040106B add edi,ebx
0040106D mov dword
ptr
[edx],edi
0040106F add eax,0Ch
00401072 add edx,0Ch
00401075 dec esi
;
这里开始两条,是循环指令
00401076 jne myfunction+20h
(401020h)
00401078 pop edi
00401079 pop esi
}
return 0;
0040107A xor eax,eax
0040107C pop ebx
}
复制过来的,效果不大好,问题在代码中用括号写出来了,xiexiedajia
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课