C语言编译成汇编乘积运算问题
C语言代码如下:
void main(unsigned long long* a,unsigned b,unsigned long long c)
{
*a=b*c;
}
编译后的汇编如下(去掉链接用的标记):
main:
pushl%ebp
movl%esp, %ebp
andl$-8, %esp
movl12(%ebp), %eax
movl20(%ebp), %ecx
imull%eax, %ecx
mull16(%ebp)
addl%ecx, %edx
movl8(%ebp), %ecx
movl%eax, (%ecx)
movl%edx, 4(%ecx)
leave
ret
第4句把b放进eax,第5句把c的高4个字节放进ecx,然后两者相乘乘积放在edx:eax中,然后把这个乘积再乘以c的低是个字节,这不就成了b*c(高4字节)*c(低4字节)
这个相乘是什么情况呢?
[解决办法]
imull %eax, %ecx 相乘的结果只在 %ecx ,不是在 edx:eax ;这个是双参数 imull 指令的规定。eax 还是 b ,所以接着是 b*loWord(c) 结果在 edx:eax 中(单个参数乘法指令的规定)。