1 movl 12(%ebp), %esi x的低32位保存在%esi
2 movl 20(%ebp), %eax y保存在%eax
3 movl %eax, %edx 将y复制到%edx
4 sarl $31, %edx y>>31 保存到%edx
5 movl %edx,%ecx 复制%edx到%ecx
6 imull %esi, %ecx (y>>31)*x_l 保存到%ecx
7 movl 16(%ebp), %ebx x_h保存到%ebx
8 imull %eax, %ebx x_h * y保存到%ebx
9 addl %ebx, %ecx (y>>31)*x_l+x_h*y保存到%ecx
10 mull %esi x_l和y做无符号全64位乘法
11 leal (%ecx,%edx), %edx 乘积的高32位加上(y>>31)*x_l + x_h*y 保存到%edx
12 movl 8(%ebp), %ecx desk地址保存在%ecx
13 movl %eax, (%ecx) 乘积的低32位保存在desk的低32位
14 movl %edx, 4(%ecx) 乘积的高32位加上(y>>31)*x_l + x_h*y保存在desk的高32位
设x_l与y做无符号全64位乘法的乘积为 mul
那么,mul_l 即为x*y的低32位
mul_h + x_h*y + (y>>31)*x_l 即为x*y的高32位
两个n位数相乘,得到一个n位的值,无论做的乘法是无符号数乘法还是有符号数乘法,得到的结果是一样的(其实就是把不一样的那些高位都舍去了)。
所以这个算法就相当于,把x和y都当成无符号数,来做乘法。
y 转换成无符号数即为 y的最左边一位乘以2的32次方再加上y本身。
列出式子,展开,即为上面的结果。