深入理解计算机系统第三章理解和习题解析之数据格式和mov指令

关于本文的说明

本文主要记录的是本人对于《深入理解计算机系统》一书中第三章部分章节个人理解和总结分析,其中包括:

1. 数据格式:对应书中3.3节
2. mov指令的理解:对应书中3.4.1、3.4.2、3.4.3 这几节内容

写在前面

  最近华为被美国禁令,前段时间中兴也被断了芯片,深感核心技术的重要性。虽然中国人多,人才多,缺钱,这几样因素整合起来让我们觉得这些外界的禁令都不成问题,只要政府政策稍加倾斜,投入人力财力物力去做相关研发,能出产品,能出成绩。但是,我还是认为,任何技术的基础部分,那些基本功东西,仍然是重要的,可能它无趣,它不出成果,客户不买你的账,但是那是一切高楼的基础。比如在程序开发行业,现在都不用汇编了,都有python、js、perl、底层点的C++,api做的即稳定有好用,那么多社区论坛,不会问百度,资源又多又方便,谁还在乎你知不知道程序是怎么编译的,可是好多这些重要的框架、库函数都是老外发明的,不知道它是怎么堆起来的用着用着就心里发虚,一个是硬性的条件哪天被禁用了,像现在一样,一个是出了问题,稀奇古怪的,都无从下手,只能放到网上搜索,一旦找不到方案就完了。
  所以翻出以前买的《深入理解计算机系统》,准备有空时补下基础知识,也许现在已经太迟了,或者看书很慢,也看不见成效,但是还是决定看下去,就当是出于热爱吧。
  为了记录看书的心得,写了博客,也欢迎各位指正讨论。

数据格式

  图3-1和图2-3两张表格记录下来,对比看即可,个人认为后者是前者的更详细部分,主要扩展部分是添加了符号和32位和64位对比。后面实例和题目主要还是基于64位,因为说明是x86-64了,但是关于符号的扩展还是需要留意。

mov指令

关于操作数指示符的理解

操作数指示出一个操作中要使用的源数据值放置结果的目的位置

原数据值:这是一个,如果是立即数则代表这个数本身,如果是寄存器或者内存地址则代表寄存器或内存地址中存放的值

目的地址:这是一个位置寄存器或者内存地址就是它本身

接着下面讲mov指令,比如

mov %rsi,%rax

  一开始我搞不清楚,这里哪个指示的是值,哪个指示位置,依据什么来判断。后来重新回来看3.4.1节,第一句话,我终于明白,第一个参数是值,第二个参数是位置,上面的指令意思是把%rsi寄存器中的值取出来放到%rax的位置中。
  仔细想想也有道理,我们是知道源数据值和目标位置的。所以系统设定是寄存器放在第一个参数代表取其中值,放在第二个参数代表这个寄存器本身。

源:数值,有以下几种类型:

  • 立即数:取这个数本身作为源操作数值
  • 寄存器:取这个寄存器中存储的值作为源操作数值
  • 内存地址:取这个内存地址中存储的值作为源操作数值

目的地址:地址 有以下几种类型:

  • 寄存器:寄存器是目的地址
  • 内存地址:内存地址是目的地址

下面举几个例子:

寄存器
%rdi0x001
%rsi0x002
内存地址
0x00130
0x00240
mov %rdi,%rsi

该指令将寄存器%rdi中的值放到寄存器%rsi中,执行完成后寄存器内容如下:

寄存器
%rdi0x001
%rsi0x001
mov (%rdi),%rsi

该指令将%rdi值0x001指示的内存地址中的值放到寄存器%rsi中,执行完成后寄存器内容如下:

寄存器
%rdi0x001
%rsi30

mov后缀b、w、l、q的确定方法总结

这个问题曾经困扰我很久,因为不知道到底该通过什么来确定使用哪个后缀,习题3.2就是关于这方面的知识。

后来查看书中的实例后个人总结如下
因为源包括:立即数、寄存器、内存地址,目的地址包括:寄存器和内存地址两种,所以应该有3*2=6种组合方案,由于不能出现源和目的地址都是内存地址的情况,所以只有6-1=5种可能的组合方案,我们将其归纳如下:

目的地址确定后缀
立即数寄存器根据寄存器确定后缀
立即数内存地址根据立即数大小确定后缀
寄存器寄存器根据目的寄存器确定后缀
寄存器内存地址根据寄存器确定后缀
内存地址寄存器根据寄存器确定后缀

优先权总结

1. 如果源和目的都是寄存器,根据第二个参数也就是目的地址寄存器来确定
2. 有寄存器根据寄存器确定
3. 其次是立即数大小
4. 内存地址没有决定权

书中给出的示例验证
- movl $0x4050,%eax 表格总结第一种
- movw %bq,%sp 表格总结第三种
- movb (%rdi,%rcx),%al 表格总结第五种
- movb $-17,(%rsp) 表格总结第二种
- movq %rax,-12(%rbq) 表格总结第四种情况

依据以上的归纳总结,习题3.2均可以套用,并且可以解决习题3.3中第二个(找错误)和倒数两个。

习题3.3中第一个的错误之处在于:x86-64系统规定所有内存地址都必须用四字长的寄存器给出,而%ebx存储双字;
习题3.3中第三个的错误之处在于:两个操作数全部是内存地址;
习题3.3中第四个的错误之处在于:没有%sl寄存器;
习题3.3中第五个的错误之处在于:目的操作数只能是地址不能是立即数.

mov中的数据转换

这里除了上面的归纳总结以外,还需要牢记以下几点
1.movq指令只能以表示为32位补码数字的立即数作为源操作数,然后把这个值符号扩展得到64位的值,放到目的位置;
2.当涉及符号和大小都需要变化时,优先进行大小变化;
3.movl指令以寄存器作为目的时,它会把该寄存器的高位4字节设置为0.

习题3.4解析:
char-int:
源:char 有符号 1字节
目的:int 有符号 4字节

均为有符号,所以是有符号扩展 movs
从1字节到4字节,b-l 所以是movsbl
目的是四字节 所以取%rax的双字寄存器 %eax
所以第一个指令是movsbl (%rdi),%eax
第二个指令从%eax到(%rsi)寄存器到内存地址,以寄存器为准所以是movl

char-unsigned
源:char 有符号1字节
目的:unsigned 无符号4字节

一个有符号一个没有,但涉及字节大小变化,优先大小,所以第一条指令没有变化符号
按照原始的有符号movs,所以是movsbl
其他参考第一个。

unsigned char -long
源:unsigned char 无符号 1字节
目的:long 有符号 8字节

这个是最难理解。
我认为应该是:movzbq(%rdi),%rax movq %rax,(%rsi)原因如下:
涉及大小变化,优先大小,第一条指令使用原始无符号movz,从1字节到四字,所以是movzbq,然后使用%rax寄存器存储8字节,再使用movq移到目的寄存器。
但是答案却是于此不同,这点还没想明白。

int-char
源:int 有符号4字节
目的:char 有符号1字节

大小变小时,先找源大小的寄存器中存下,然后在从其中更低位寄存器中读取。
所以此处movl(%rdi),%eax 然后从%al中取

同样可以解释下一个

  • 62
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
### 回答1: 深入理解计算机系统(CSAPP)是由Randal E. Bryant和David R. O'Hallaron编写的经典计算机科学教材。该教材通过涵盖计算机体系结构、机器级别表示和程序执行的概念,帮助学生深入理解计算机系统的底层工作原理和运行机制。 深入理解计算机系统的练习题对于学生巩固并应用所学知识非常有帮助。这些练习题涵盖了计算机硬件、操作系统和编译器等多个领域,旨在培养学生解决实际问题和设计高性能软件的能力。 对于深入理解计算机系统的练习题,关键是通过实践进行学习。在解答练习题时,应根据课本提供的相关知识和工具,仔细阅读问题描述,并根据实际需求设计相应的解决方案。 在解答练习题时,需要多角度思考问题。首先,应准确理解题目要求,并设计合适的算法或代码来解决问题。其次,应考虑代码的正确性和效率,以及对系统性能的影响。此外,还要注意处理一些特殊情况和异常情况,避免出现潜在的错误或安全漏洞。 解答练习题的过程中,应注重查阅相关资料和参考优秀的解答。这可以帮助我们扩展对问题的理解,并学习他人的思路和解决方法。同时,还可以通过与同学和老师的讨论,共同探讨问题和学习经验。 总之,通过解答深入理解计算机系统的练习题,可以帮助学生巩固所学知识,同时培养解决实际问题和设计高性能软件的能力。这是一个学以致用的过程,可以加深对计算机系统运行机制和底层工作原理的理解。 ### 回答2: 理解计算机系统(CSAPP)是一本经典的计算机科学教材,通过深入研究计算机系统的各个方面,包括硬件、操作系统和编程环境,对于提高计算机科学专业知识与能力具有很大帮助。 练习题是CSAPP中的重要部分,通过练习题的完成,可以加深对计算机系统的理解,并将理论知识转化为实践能力。练习题的数量、难度逐渐递增,从简单的概念与基础问题到复杂的系统设计与实现。 在解答练习题时,首先需要对题目进行仔细阅读和理解,明确题目的要求和限制条件。然后,可以利用课堂讲解、教材内容、网络资源等进行查阅和学习相应的知识。同时,还可以参考课后习题解答等资料,了解一些常见的解题方法和思路。 在解答练习题时,可以利用计算机系统的工具和环境进行实际测试和验证。例如,可以使用调试器、编译器和模拟器等工具对程序或系统进行分析和测试。这样可以更加深入地理解问题的本质,并找到恰当的解决方法。 另外,解答练习题时还可以与同学、教师和网上社区进行交流和讨论。这样可以互相学习和交流解题思路,共同解决问题。还可以了解不同的解题方法和技巧,提高解题效率和质量。 练习题的解答过程可能会遇到一些困难和挑战,例如理论知识的不足、复杂问题的分析与解决。但是通过不断地思考和实践,相信可以逐渐提高解题能力,更好地理解计算机系统。 总之,深入理解计算机系统(CSAPP)练习题是提高计算机科学专业知识和能力的重要途径。通过仔细阅读和理解题目,查阅相关知识,利用计算机系统工具和环境进行实践,与他人进行交流和讨论,相信可以更好地理解计算机系统的各个方面,并将知识转化为实际能力。 ### 回答3: 《深入理解计算机系统(CSAPP)》是计算机科学领域的经典教材之一,对于深入理解计算机系统的原理、设计和实现起到了极大的帮助。在阅读这本书的过程中,书中的习题也是非常重要的一部分,通过做习题,我们可以更好地理解书中所讲的概念和思想。 CSAPP的习题涵盖了课本中各个章节的内容,从基础的数据表示和处理、程序的机器级表示、优化技术、程序的并发与并行等方面进行了深入探讨。通过解答习题,我们可以对这些知识进行实践应用,巩固自己的理解,并培养自己的解决问题的思维方式。 在解答习题时,我们需要充分理解题目要求和条件,并从知识的角度进行分析。有些习题可能需要进行一些编程实践,我们可以通过编程实现来验证和测试我们的思路和解决方案。在解答问题时,我们还可以查阅一些参考资料和网上资源,充分利用互联网的学习资源。 在解答习题时,我们需要保持积极的思维和态度。可能会遇到一些困难和挑战,但是通过坚持和努力,我们可以克服这些困难,提高我们的解决问题的能力。同时,我们还可以通过与同学或者其他人进行讨论,相互分享解题经验和思路,从而更好地理解问题。 综上所述,通过深入理解计算机系统(CSAPP)的习题,我们可以进一步巩固和深化对计算机系统的理解。掌握这些知识,不仅可以提高我们在计算机领域的能力,还可以为我们未来的学习和职业发展奠定重要的基础。因此,认真对待CSAPP的习题,是我们在学习计算机系统知识中不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值