分析一段C语言算法后,我懂得了汇编用于写程序的用途的抛弃的必然性
C语言一个简单算法的代码 没神马意义,就一个两层嵌套循环对一个二维数组的操作而已。
(本文中有QQ空间的图,如果图挂了 请到我qq空间看,不好意思 http://user.qzone.qq.com/315102821/blog/1334651812)
看汇编代码,几张图是连着的。
循环语句那一段经典代码我就不解释了。。参考<<天书夜读 从汇编语言到windows内核>>吧 主要分析地址为411A6E到411AC1这里面的汇编语句吧(其实这里面就等于c[j]= a[0] * b[0][j] + a[1] * b[1][j] + a[2] * b[2][j];) 注意一下的话可以发现,mov 寄存器,dword ptr 这一句,经常出现,出现了四次,我以每次这条语句出现的地方作为一部分来讲解吧
看着这条表达式吧 方便参考:c[j]= a[0] * b[0][j] + a[1] * b[1][j] + a[2] * b[2][j];
-------------------------------------第一部分-------------------------------------
eax=i*0Ch; 结构体元素偏移地址=第几个结构体*结构体元素大小 ecx=a;
esi=b;
edx=j; eax=ecx+eax; 结构元素地址=数组首址+结构体元素偏移地址
eax=eax*(esi+edx*4);
;esi是数组b的首址,edx是j,j=0 to 2,0=0*4(第0个下标元素)
4=1*4(第1个下标元素)
8=2*4(第2个下标元素)
因为一维下标总是0所以才可以用这种方式寻址数组
-------------------------------------第一部分------------------------------------- -------------------------------------第二部分-------------------------------------
ecx=i*0Ch; 结构体元素偏移地址=第几个结构体*结构体元素大小 edx=a;
edi=b;
esi=j; ecx=edx+ecx+4; 结构元素地址=数组首址+结构体元素偏移地址+4个字节(不加4字节就是第0个下标元素,加了自然就是第一个了)
ecx=ecx*(edi+esi*4+0ch); ecx求出来了,现在要累乘,结果还是放在ecx。edi为b首址,esi为j j*4字节就是:第j个元素所在字节位置,
然后再加了0ch是因为一维坐标始终为1,即一维坐标为0时造成的3个int元素
我们还得加上去,3*4字节=12字节=0ch字节,所以要加0ch
add eax,ecx; 已经有两个表达式计算出来了,所以先将它们加起来吧
-------------------------------------第二部分------------------------------------- -------------------------------------第三部分-------------------------------------
edx=i*0Ch; 结构体元素偏移地址=第几个结构体*结构体元素大小 ecx=a;
edi=b;
esi=j; edx=edi+edx+8; b的首址+结构体元素偏移地址+第2个下标元素(即第3个数组元素,所以+8字节)
edx=edx*(edi+(esi*4)+18h) edx照乘,被乘数为b的首址+一维下标为2造成的18h个字节的占用+j*4字节。 add eax,edx 最后结果在eax中了 -------------------------------------第三部分------------------------------------- -------------------------------------第四部分-------------------------------------
ecx=i*0Ch; 结构体元素偏移地址=第几个结构体*结构体元素大小 ecx=ecx+c edx=j
ecx+edx*4=eax; 这句当然是把结果给c[j]了
-------------------------------------第四部分-------------------------------------
|