3.49


解释5-7行

第5行汇编得到8n+22。

第6行8n+22与立即数-16进行与运算。按照最高位为符号位来说,-16的二进制为1 0000,因为符号拓展值不变,所以-16的8字节表示为.... 1111 0000,省略号全为1。所以第6行是要将8n+22与.... 1111 0000进行与运算,这会导致8n+22的低4位如果谁有1都会被舍弃掉,原文描述为:“把它向下舍入到最接近的16的倍数”,因为是舍弃低4位所以是“向下舍入”。按照本人描述为:舍弃掉权值为8,4,2,1的二进制位,只留下权值大于等于8的二进制位

所以,与$-16进行与运算后,结果将会是16的倍数。倍数可能是0,1…

当n为偶数时,将8n+22拆分为8n和22。既然n为偶数,则8n为16的倍数,那么8n and $-16 = 8n22 and $-16 = 16。将两个结果加起来就是8n + 16.
当n为奇数时,将8n+22拆分为8(n-1)和30。既然n-1为偶数,则8(n-1)为16的倍数,那么8(n-1) and $-16 = 8(n-1)30 and $-16 = 16。将两个结果加起来就是8n + 8.

还有就是这个22,其实可以替换为16-23中一个数都可以,把这个数称为m,那么要求m或者m+8在和与$-16进行与运算后,结果必须为16,从这个要求就可以得出这个范围。

举一反三地,一个数与$-32进行与运算后,结果是32的倍数,道理和上面一样。一个数与$-1进行与运算后,结果是1的倍数,因为二进制位上全是1,即它本身。

从结果来看,除了数组需要的8n空间外,还可能多分配8或16字节的空间另作他用。另外不管是奇数偶数,两种情况结果都将是16的倍数。

解释8-10行

在此之前,先回想一下补码除以2的幂里面,x>>kx >>kx>>k将产生数值⌊x/2k⌋\lfloor {x/2^k} \rfloor⌊x/2k⌋,当x为负数时,我们通过加一个偏置值bias,使得(x+bias)>>k(x+bias) >>k(x+bias)>>k将产生数值⌈x/2k⌉\lceil {x/2^k} \rceil⌈x/2k⌉,bias为2k−12^k-12k−1。

同样地,在第8行,将%rsp加上7即23−12^3-123−1,假设%rsp栈指针为x,在第9行右移3位,这里将产生⌈x/23⌉\lceil {x/2^3} \rceil⌈x/23⌉即⌈x/8⌉\lceil {x/8} \rceil⌈x/8⌉。第10行乘以8,相当于左移3位。

可以想象,当%rsp刚好是8的倍数时,执行完8-10行,不变,因为向上取整时为本身。当%rsp不是8的倍数时,执行完8-10行,为%rsp+8,因为向上取整时加1了。

换个角度,7的二进制为111,当%rsp的低三位是000时,加上111不会使得第4位加1;当%rsp的低三位不是000而是其他情况时,加上111肯定使得第4位加1。然后第9,10行的操作是先右移3位,再左移3位,这就相当于把低3位的二进制值清0。

总结一下:要么%rsp不变,要么%rsp向上舍入到最接近8的倍数。

确定结果值

在第7行汇编分配栈空间时,是将e1e_1e1​和e2e_2e2​和数组的空间一起考虑的了。
当第10行汇编执行,才会确定了e1e_1e1​和e2e_2e2​的大小。因为只有这个时候才知道了数组空间的开始地址和结束地址。
注意这个图里面,e1e_1e1​和e2e_2e2​不一定都是8个字节哦。

当s1s_1s1​为刚好为8的倍数时,e1e_1e1​和e2e_2e2​就没什么用了,起码不需要它俩来8K对齐了,因为本来就是8K对齐的。
当s1s_1s1​为其他情况时(其他情况中,如果让数组空间直接从s2s_2s2​开始分配都会造成8K不对齐),e1e_1e1​和e2e_2e2​就可以用来保证数组每个元素8K对齐。


分析答案前,可以理解这么一个事实,当一个数组空间本身不8K对齐时(前提数组元素需要8字节存储),那么前后移动1-7字节便一定可以8K对齐

在第一行答案中,可见s1s_1s1​和s2s_2s2​都不是8K对齐的,本来p数组理应从s2s_2s2​这个地址开始分配,但这里必须从s2s_2s2​上面舍入到8的倍数,这样就保证了数组p的8K对齐。相当于数组p往地址增加方向移动了7个字节。

解释15-18行

其实这里有点不大理解,因为15和16行看起来有点多此一举,如果是因为局部变量i需要存储在栈中,那么有15行就够了呀,16行汇编执行后并不会让寄存器%rax改变(所以说它没有用)。

其他

这个题是考虑了这么一种情况,调用此函数时的栈指针就已经不是8K对齐的了。

《深入理解计算机系统》 练习题3.49详解相关推荐

  1. 2020-11-26((《深入理解计算机系统》多级页表详解)补充)

    今日总结: 今天主要把11-25(<深入理解操作系统>多级页表详解)第一部分看懂,并把它做了一个补充,让看博客的各位更能深刻理解,谢谢各位支持,一起加油 明日目标: 复习大学物理,线性代数 ...

  2. 2020-11-25(《深入理解计算机系统》多级页表详解)

    一.端到端地址翻译示例 从图上看,TLBI占了t位,而TLBT占了n-p-t位. 上节我们刚把TLB开了个头,多说无益,还是具体来玩个实际例子吧,具体来做一个端到端(虚拟地址到物理地址)的地址翻译示例 ...

  3. 自然语言处理NLP星空智能对话机器人系列:第21章:基于Bayesian Theory的MRC文本理解基础经典模型算法详解

    自然语言处理NLP星空智能对话机器人系列: 第21章:基于Bayesian Theory的MRC文本理解基础经典模型算法详解 1,Bayesian prior在模型训练时候对Weight控制.训练速度 ...

  4. 大二c语言期末考试题库及详解答案,大学C语言期末考试练习题(带详解答案)...

    <大学C语言期末考试练习题(带详解答案)>由会员分享,可在线阅读,更多相关<大学C语言期末考试练习题(带详解答案)(55页珍藏版)>请在金锄头文库上搜索. 1.一. 单项选择题 ...

  5. 全面理解EOS——3.cleos使用详解

    之前的文章EOS流行之痛--RAM机制设计缺陷?和EOS数据分析--让RAM再飞一会儿 从原理和数据理解EOS上的RAM资源及价格形成.原本想马上写一篇警示RAM投机的文章,朋友提醒,可能会被认为是做 ...

  6. 关于事务管理的理解和Spring事务管理详解

    转载于:http://www.mamicode.com/info-detail-1248286.html 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000 ...

  7. 计算机视觉未来走向:视频理解等5大趋势详解

    作者:廖康,北京交通大学信息科学研究所 校对:梦佳 智源导读:近年来,深度学习在各种计算机视觉任务上都取得了重大的突破,其中一个重要因素就是其强大的非线性表示能力,能够理解图像更深层次的信息.本文针对 ...

  8. 深入理解计算机系统 练习题3.8 理解计算机二元操作

    我讲解这道题的目的是为了让大家理解结果为什么是那样的,假如对基础知识不是特别了解的人,可能会对答案有疑问,但是答案并没有详细讲解为什么会得到哪些答案. 这里推荐我写的另一篇博客,https://blo ...

  9. 计算机组成原理第二章练习题(答案详解)

    注:最后一节始终是待批改状态,以及改过的也看不见正确答案,答案如果有错,评论区告诉我哈,我在改改. PS.重复的题有点多,有的题出现的章节不对,学校抽题系统的问题吧.. 目 录 存储系统 2.1 主存 ...

最新文章

  1. 搭建oracleRAC详解(裸设备)
  2. Spring MVC 入门示例讲解
  3. php sql 二次注入,espcms 二次注入一枚
  4. Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程
  5. unity android 分包,Unity以分包(obb)形式集成到安卓原生 我慢慢填坑
  6. Python笔记-沪深三百与茅台简单分析(2021年数据)
  7. g2 折线图点与点之间直线_g2曲线图 每条曲线有单独的选中效果和tooltip
  8. linux安装nfs服务器
  9. 敏捷开发与测试(面试话题之一)
  10. mysql数据基本指令_mysql数据库常用命令(详细)
  11. php 环境优化,[笔记] 使用 opcache 优化生产环境 PHP
  12. MyBatis开发经验总结
  13. VS2012新建项目
  14. rem css calc,关于使用rem单位、css函数calc()进行自适应布局
  15. “宅经济”催化下的泛娱乐行业,未来将引爆哪些增长点?
  16. Hyperf基础使用
  17. qt 设置进程优先级_如何设置最低优先级的进程?
  18. JAVA+JDBC超级详解---从连接数据库到连接池
  19. java 完全匹配_正则表达式的完全匹配和部分匹配
  20. 微软官方XP精简版 FLP入门版SP3截图

热门文章

  1. Android的数据库 SQLite数据库:SQLite
  2. vue项目,svn提交代码时忽略node_modules文件夹提交。
  3. 南京哪个211计算机好一点,南京市所有985,211大学及其王牌专业,哪个更好
  4. rockpi4b刷入安卓11镜像后跑不起来
  5. 58同城再曝上市传闻:筹资至少1亿美元
  6. golang ide 环境搭建_golang 开发环境 配置 go语言 liteIDE
  7. 21、Java——超市会员管理系统(对象+集合)
  8. 玩转Vue3全家桶开篇词丨如何借助Vue3建构你的前端知识体系?
  9. 车辆工程专业/鼓式制动器/盘式制动器/制动系统/电磁制动器……毕业设计题目推荐
  10. c语言 字符串加密和解密算法实现