首页
社区
课程
招聘
[求助]这段反汇编有点不理解,求救!
发表于: 2008-11-23 07:48 2653

[求助]这段反汇编有点不理解,求救!

2008-11-23 07:48
2653
下面是发行版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++)
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             ;这里已经开始处理数据。必须把这些指令和
                              ;函数入口指令和循环控制指令分开
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[j] = a[0]*b[0][j]+a[1]*b[1][j]+a[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   
}

0040100E  add         eax,4   
这行就不能理解了,为什么要把eax加4? eax不是已经是传入参数的首地址了啊?同样edx加8也不能理解。
看了好多遍,始终不能明白。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
这是楚狂人书中的例子。

请你自己仔细思考一下。可以画个图来帮助自己思考。

其实书里已经说了,这是编译器优化的结果

关于编译器优化,很多时候是“编译器”莫名其妙地修改代码,甚至可能只有编译器的作者才知道为什么如此修改。

正常情况下,非常自然的一实现方法是,EAX存放a[i],而用[eax],[eax+4],[eax+8]来访问a[i][0],a[i][1]和a[i][2],而这里编译器却用EAX存放 &a[i][1],而访问方式变成了[eax-4],[eax],[eax+4]。

本人对编译器优化没有任何了解,所以不知道这么生成代码的意图是什么。但只要程序逻辑正确,就不用太追究了,毕竟这几样的代码还是规整的,容易阅读的。
2008-11-23 17:47
0
游客
登录 | 注册 方可回帖
返回
//