当前位置: 代码迷 >> 汇编语言 >> C语言编译成汇编乘积运算有关问题
  详细解决方案

C语言编译成汇编乘积运算有关问题

热度:5920   发布时间:2013-02-26 00:00:00.0
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
movl 12(%ebp), %eax
movl 20(%ebp), %ecx
imull %eax, %ecx
mull 16(%ebp)
addl %ecx, %edx
movl 8(%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 中(单个参数乘法指令的规定)。
  相关解决方案