深入理解计算机系统(英文版 第二版)中的第三章家庭作业3.55想了一个晚上也没有想出来到底是怎么回事。百度也没有百度出结果,而用google搜索相关内容,终于找到了其中的“猫腻”。

如果想要直接看,则点击下面链接。

http://stackoverflow.com/questions/11680720/implement-64-bit-arithmetic-on-a-32-bit-machine

书中,3.55题在P329页,题目略有不同,但原理一致。


The following code computes the product of x and y and stores the result in memory. Data type ll_t is defined to be equivalent to long long.

1 typedef long long ll_t;
2 void store_prod(ll_t *dest, int x, ll_t y) {
3     *dest = x*y;
4 }

gcc generates the following assembly code implementing the computation:

dest at %ebp+8, x at %ebp+12, y at %ebp+16

 1 movl 16(%ebp), %esi
 2 movl 12(%ebp), %eax
 3 movl %eax, %edx
 4 sarl $31, %edx
 5 movl 20(%ebp), %ecx
 6 imull %eax, %ecx
 7 movl %edx, %ebx
 8 imull %esi, %ebx
 9 addl %ebx, %ecx
10 mull %esi
11 leal (%ecx,%edx), %edx
12 movl 8(%ebp), %ecx
13 movl %eax, (%ecx)
14 movl %edx, 4(%ecx)

This code uses three multiplications to implement the multiprecision arithmetic required to implement 64-bit arithmetic on a 32-bit machine. Describe the algorithm used to compute the product, and annotate the assembly code to show how it realizes your algorithm.


简要地分析一下上述代码的原理。我们知道x是32位,而y是64位,我们将x按符号扩展为64位,这一步即为汇编中3、4行的作用。实际上,x在符号扩展前后,与y相乘的64位结果是一样的。

x=xhigh*232+xlow

y=yhigh*232+ylow

x*y=(xhigh*yhigh)*264        (1)

  +(xlow*yhigh+xhigh*ylow)*232  (2)

  +xlow*ylow               (3)

我们要取它的低64位结果,故(1)直接省略;

64位结果中,低32位的结果可以直接使用(3)计算出来;

高32位结果由两部分构成:(2)的低32位结果+(3)的高32位结果;

要得到(3)的高32位结果,我们需要使用mul的单操作数形式,在edx中保存乘积的高32位。需要注意的是这里使用mul无符号乘法运算,是由于y是64位的,低32位可以看作无符号数,因此,如果使用imul,虽然低32位的结果是正确的,但是高32位结果却是错误的。

转载于:https://www.cnblogs.com/XjChenny/archive/2013/04/06/3002000.html

【深入理解计算机系统-第二版】3.55习题相关推荐

  1. Python编程从入门到实践(第二版)课后习题自写代码

    Python编程从入门到实践(第二版)课后习题自写代码 第八章 函数 最近自学的python,动手做了一下课后习题,错误也许会有,和大家一起探讨.多多指教! 8.3 返回值 动手试一试代码片 &quo ...

  2. 《视觉SLAM十四讲 第二版》课后习题

    本文为<视觉SLAM十四讲>(第二版)的课后习题解答,为本人学习时参考着网上的资源所写的答案,可能有所纰漏,希望大家指出. 文章目录 第1讲 预备知识 第2讲 初始SLAM 第3讲 三维空 ...

  3. 刘汝佳《算法竞赛入门经典(第二版)》习题(三)

    刘汝佳<算法竞赛入门经典(第二版)>第三章习题(一) 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分.每个 ...

  4. 刘汝佳《算法竞赛入门经典(第二版)》习题(六)

    刘汝佳<算法竞赛入门经典(第二版)>第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有 ...

  5. 刘汝佳《算法竞赛入门经典(第二版)》习题(二)

    刘汝佳<算法竞赛入门经典(第二版)>第二章习题 目录 刘汝佳<算法竞赛入门经典(第二版)>第二章习题 习题2-1 水仙花数 习题2-2 韩信点兵 习题2-3 倒三角形 习题2- ...

  6. 开发日记-20190625 Linux系统管理技术手册(第二版) 第一章习题答案(个人版)

    Preface 2333,果然,一章需要三天左右才能完成,这都第二天了,习题才做完前两道,不过通过这两道也了解到了这本书的习性了,不错,不错. Content E1.1 了解系统调用sync(不是sy ...

  7. 开发日记-20190626 Linux系统管理技术手册(第二版) 第一章习题答案(个人版)

    Preface 交流才是王道,只有在极少数情况下,一个天才的能力会超越一百个凡人 Content E1.3 man和info之间的主要区别是什么?他们各自有什么优点? man手册页对单条命令,驱动程序 ...

  8. 《算法竞赛入门经典(第二版)》习题解答——第二章

    文章目录 一.习题2-1 水仙花数(daffodil) 二.习题2-2 韩信点兵(hanxin) 三.习题2-3 倒三角形(triangle) 四.习题2-4 子序列的和(subsequence) 五 ...

  9. 深入理解计算机系统视频版,绝对干货

    csapp的作者的讲课视频,分享给大家,看视频加上书效果应该不错. B站:https://www.bilibili.com/video/av31289365 youtube:https://www.y ...

  10. python第二版课后习题答案_《python核心编程第二版》课后习题6-12答案

    下午脑子瓦特,想了半天也没有想出算法,刚刚抽风终于实现了,特此记录. ̄□ ̄|| 题目 (a)创建一个名字为 findchr()的函数,findchr()要在字符串 string 中查找字符 char, ...

最新文章

  1. jsp 出现cannot be resolved to a type问题解决办法
  2. Microsoft 服务器产品端口
  3. python入门教程2word-使用python操作word
  4. [Issue Fixed]-repo-error: .repo/manifests/: contains uncommitted changes
  5. oracle spa sta 使用,Oracle的SQL Tuning Advisor(STA) 到底做了什么?
  6. oracle中noguarantee,关于undo guarantee
  7. linux 安装库 编译提示-lcrypto 无法链接,缺少 crypto 库
  8. 数据分析师最终都会代码化的3点原因?!
  9. knn实战:如何对手写数字进行识别?
  10. php 动态多维数组长度,php – 动态创建多维数组
  11. Ant Design 框架
  12. 算法界的“视界杯”,2021腾讯广告算法大赛来了!
  13. 仿苹果手机_仿iphone12充电动画下载-仿iphone12充电动画软件下载 v1.1
  14. 阿里云盘登录空白问题解决
  15. 《Python自然语言处理》——1.1 语言计算:文本和词汇
  16. 智能手环---设计与实现
  17. 控制器分析-绘制伯德图
  18. 安全可靠快速地导出微信聊天记录
  19. 学生免费申请JetBrains许可
  20. 关于只读事务:@Transactional(readOnly = true)

热门文章

  1. Regular Expression(正则表达式)之邮箱验证
  2. 10.11 noip模拟试题
  3. 转载 :sql server 2005 无法删除数据库 #Test,因为该数据库当前正在使用
  4. 【转】Linux内核调试方法总结
  5. 多模态 | 从顶会论文看多模态预训练研究进展
  6. 【ICLR2019】重要的,是那些训练中被多次遗忘的样本
  7. 【BERT】BERT的嵌入层是如何实现的?看完你就明白了
  8. 【基础】集成学习 (Ensemble Learning)
  9. TF2—tf.keras.layers.BatchNormalization
  10. Mysql中的日期及时间相关函数