一段普通的for循环对应的汇编语言,有没有人能帮忙解释一下,多谢了!

C++代码为:
for(int i=0; i<dataLen; i++)
{
*pp3 = (*pp1) * (*pp2);
pp1++;
pp2++;
pp3++;
}

对应的汇编代码为:
for(int i=0; i<dataLen; i++)
000000013FFBE0A7 sub rcx,rbx
000000013FFBE0AA mov eax,0EE6B280h
000000013FFBE0AF sub rdi,rbx
{
*pp3 = (*pp1) * (*pp2);
000000013FFBE0B2 movups xmm1,xmmword ptr [rdi+rbx]
000000013FFBE0B6 movups xmm0,xmmword ptr [rbx]
pp1++;
pp2++;
000000013FFBE0B9 lea rbx,[rbx+10h]
000000013FFBE0BD mulps xmm1,xmm0
000000013FFBE0C0 movups xmmword ptr [rcx+rbx-10h],xmm1
000000013FFBE0C5 dec rax
000000013FFBE0C8 jne testfun+1D2h (013FFBE0B2h)
pp3++;
}
}
这段汇编代码好像优化了,能不能帮忙解释一下,多谢了!

第1个回答  2013-08-28
其他的看不懂,没了解过64位的指令,单看下面2句
000000013FFBE0C5 dec rax
000000013FFBE0C8 jne testfun+1D2h (013FFBE0B2h)
猜测rax里面存放的是循环的步长.因为i = 0且i要小于dataLen所以直接把datalen的值给寄存器然后自减.

jne是不等于0就继续循环.所以减到0的时候就不循环了.据说编译器优化之后的release里面只有dowhile循环,while循环被优化成了if+dowhile的形式.for循环没有仔细看,应该也差不多
第2个回答  2013-08-27
64位汇编

流媒体处理指令

楼主 你赢了~
第3个回答  2013-08-27
肝顶替有顶替有