csapp2e 家庭作业 3.55

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本身。

列出式子,展开,即为上面的结果。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值