我讲解这道题的目的是为了让大家理解结果为什么是那样的,假如对基础知识不是特别了解的人,可能会对答案有疑问,但是答案并没有详细讲解为什么会得到哪些答案。

这里推荐我写的另一篇博客,https://blog.csdn.net/ciqingloveless/article/details/84136002
,这里详细讲述了寄存器寻址,后面有的内存我回省略。

题目

假设下面的值存放在指定的内存地址和寄存器中:

地址
0x100 0xFF
0x108 0xAB
0x100 0xFF
0x100 0xFF
寄存器
%rax 0x100
%rcx 0x1
%rdx 0x3

填写下表,给出下面之灵的效果,说明被更新的寄存器或内存位置,以及得到的值:

指令 目的
addq %rcx,(%rax)
subq %rdx,8(%rax)
imulq $16,(%rax,%rdx,8)
incq 16(%rax)
decq %rcx
subq %rdx,%rax

解答

其实这道题的难点还是在寄存器寻址上,假如对寄存器寻址不是特别清楚,那么这道题可能特别绕,下面我就讲解答案。

根据二元运算符定义,使用add举例:

ADD S,D的含义是 D <- D + S

其他指令格式与上面相同,他的理解就是用D加上S放入D,这个放入D很关键。好了,下面进行答案讲解。

  • 在addq %rcx,(%rax)这个题目中,我们列取一下各个的值:

    S -> %rcx

    D -> (%rax)

    addq %rcx,(%rax) = (%rax) + %rcx

    现在的问题是各个值是多少,那么这里着重说一下%rcx与(%rax)的区别,%rcx是寄存器寻址,(%rax)是寄存器间接寻址,%rcx就是所需要的值,(%rax)中的值是地址,所以(%rax)的值还得根据(%rax)中的值再去找一次,所以得出如下结果

    S -> %rcx -> 0x1

    D -> (%rax) -> 0x100 -> 0xFF

    addq %rcx,(%rax) = 0xFF + 0x1 = 0x100

  • subq %rdx,8(%rax)我们也按照上面方式讲解

    S -> %rdx

    D -> 8(%rax) -> %rax + 8 -> 0x100 +8 -> 0x108 -> 0xAB

    subq %rdx,8(%rax) = %rax + 8 - %rdx

    这里的难点是8(%rax)为什么是%rax + 8,因为这个采用的是(基址 + 偏移量)寻址。

    subq %rdx,8(%rax) = 0xAB - 0x3 = 0xA8

后面我就不那么详细讲解了直接列了

  • imulq $16,(%rax,%rdx,8)

    S -> $16 -> 16

    D -> (%rax,%rdx,8) -> %rax + 8 * %rdx -> 0x100+0x18 -> 0x118 -> 0x11

    imulq $16,(%rax,%rdx,8) = 0x11 * 16 = 0x110

  • incq 16(%rax)

    INC D 的定义是 D <- D + 1

    所以根据定义有如下结果

    D -> %rax + 16 -> 0x100 + 16 -> 0x110

    所以计算结果为

    incq 16(%rax) = 0x13 + 1 = 0x14

  • decq %rcx

    解释如上

    incq 16(%rax) = 0x1 - 1 = 0x0

  • subq %rdx,%rax

    这个也不再详细解释了,有问题留言

    subq %rdx,%rax = 0x100 - 0x3 = 0xFD

所以最后结果如下

指令 目的
addq %rcx,(%rax) 0x100 0x100
subq %rdx,8(%rax) 0x108 0xA8
imulq $16,(%rax,%rdx,8) 0x118 0x110
incq 16(%rax) 0x110 0x14
decq %rcx %rcx 0x0
subq %rdx,%rax %rax 0xFD

深入理解计算机系统 练习题3.8 理解计算机二元操作相关推荐

  1. 深入理解计算机系统 相关课程,深入理解计算机系统

    作者简介: Randal E. Bryant   1981年于麻省理工学院获得计算机博士学位,1984年至今一直任教于卡内基-梅隆大学.现任卡内基-梅隆大学计算机科学学院院长.教授,同时还受邀任教于电 ...

  2. 【送两本】计算机领域神书《深入理解计算机系统》

    作者:Randal E. Bryant,David R. O'Hallaron 来源:华章计算机(hzbook_jsj) 文末送两本<深入理解计算机系统>第三版,包邮. <深入理解计 ...

  3. 深入了解计算机的知识,电脑入门基础知识之深入理解计算机系统

    电脑入门基础知识之深入理解计算机系统 导语:计算机系统由计算机硬件和软件两部分组成.硬件包括中央处理机.存储器和外部设备等.下面就来看看小编为大家整理的资料,希望对您有所帮助! 简介 按人的要求接收和 ...

  4. 理解计算机的特性性能和应用,计算机系统性能评价认识与理解.doc

    计算机系统性能评价认识与理解 对计算机系统性能评价的认识和理解 1.什么是计算机系统性能评价? 在20世纪60年代中期,出现了多任务.多用户的计算机系统,随着大家对这种系统的应用,人们发现这些系统表现 ...

  5. 《深入理解计算机系统》 练习题3.9-3.11 移位操作

    移位操作 移位操作是二元操作.第一个操作数是移位量,第二个操作数是被移位的数. 移位量只能是立即数,或者放在单字节寄存器%cl中. 被移位的数可以是一个寄存器,或者一个内存位置. 如果移位操作对w位长 ...

  6. 《深入理解计算机系统(英文版.第2版)》

    <深入理解计算机系统(英文版.第2版)>china-pub计算机新书推荐 本书双色印刷,计算机软硬件理论结合讲述的经典之作. 页码:1077 基本信息原书名: Computer Syste ...

  7. 如何阅读《深入理解计算机系统》?(文末送书)

    来源:华章计算机 作者:木羊同学 导读:如果你也读CS专业,如果你也不知道怎么回答"学计算机不就是学修电脑"这个CS系的宿命之问,推荐一定读一读<深入理解计算机系统>. ...

  8. 《深入理解计算机系统(原书第三版)》pdf

    下载地址:网盘下载 内容简介  · · · · · · 和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础.主要更新如下: 基于x86-64,大量地重 ...

  9. 如何阅读《深入理解计算机系统》

    作者:Randal E. Bryant,David R. O'Hallaron 来源:华章计算机(hzbook_jsj) <深入理解计算机系统>(简称CS:APP)的主要读者是计算机科学家 ...

最新文章

  1. Message LongText(消息的详细长文本)
  2. 不显示坐标刻度_如何使用坐标交叉位置来改变Excel图表的展现形态
  3. php 字符符转整数
  4. python求小于n的所有素数_用python求出2000000内所有素数的和?不知怎么写?
  5. JVM优化系列-JVM内存溢出的原因
  6. 多个ajax执行混乱问题
  7. php mysql sum_thinkphp mysql语句 sum
  8. 【Flutter】Dart中的var、final 和 const基本使用
  9. 冒泡、选择、快速、归并、堆排序算法 python实现
  10. x265中checkMerge2Nx2N_rd0_4()分析(版本2.8)
  11. 过来-神秘的Word域代码
  12. Ubuntu 报错 malloc(): unsorted double linked list corrupted
  13. 创业公司的融资阶段:天使轮、种子轮、A轮、C轮、E轮到底是什么意思?
  14. 小米平板2刷哪个系统更流畅_Windows 10版小米平板2简测:流畅度不及自家MIUI版...
  15. 学会这几个.你就能成为bat脚本小子了...(转来看看的)
  16. linux fstab错误无法启动,Linux 系统 fstab错误导致系统无法启动的修复
  17. 实例简述Spring AOP之对AspectJ语法的支持
  18. 从0和1开始,揭开数字世界的神秘面纱
  19. lm2576使用注意
  20. Web基础(从入门到项目实战)

热门文章

  1. IBIS模型的那些年这些事(一)
  2. SQL Server 2014如何修改数据库名
  3. 你知道吗?除了迅雷,这几款下载神器也不错!
  4. 连咖啡:新零售时代中的娱乐“生意经” | 一点财经
  5. 目标检测(六):DSSD
  6. 关于手机设置高对比度文字对app的影响及解决方案
  7. LLaMA模型系统解读
  8. 美国计算机视觉专业排名,你了解美国计算机视觉专业吗
  9. 爬楼梯--每次只能走一步或者两步,但是不能连续走两步
  10. 云南大学保利勇计算机网络,云南大学信息学院全日制硕士导师信息