【深入理解计算机系统csapp】程序的机器级表示|x86-64寄存器

x86-64寄存器名称

x86-64寄存器起名:8位,%al;16位,%ax;32位,%eax;64位,%rax

x86-64寄存器作用

%rax: 返回值
%rbx: 被调用者保存
%rcx: 第4个参数
%rdx: 第3个参数
%rsi: 第2个参数
%rdi: 第1个参数
%rbp: 被调用者保存
%rsp: 栈指针
%r8: 第5个参数
%r9: 第6个参数
%r10: 调用者保存
%r11: 调用者保存
%r12: 被调用者保存
%r13: 被调用者保存
%r14: 被调用者保存
%r15: 被调用者保存
在这里插入图片描述

操作数种类

操作数分三种:立即数,寄存器,内存引用

立即数表示

汇编立即数表示:以$开头,跟着标准C表示法,如$-577$0x1F。不同的指令允许的立即数范围不同

寻址方式

寻址方式:立即数寻址,立即数作为值;寄存器寻址,寄存器值作为值;绝对寻址,立即数对应内存地址的内存值;间接寻址,寄存器值对应内存地址的内存值;变址寻址,运算表达式对应内存地址的内存值

表达式:(s取值1,2,4,8)

$Imm: Imm,立即数寻址

ra: R[ra],寄存器寻址
Imm: M[Imm],绝对寻址
(ra): M[R[ra]],间接寻址
Imm(rb): M[Imm + R[rb]],(基址+偏移量)寻址
(rb, ri): M[R[rb] + R[ri]],变址寻址
Imm(rb, ri): M[Imm + R[rb] + R[ri]],变址寻址
(,ri, s): M[R[ri] * s],比例变址寻址
Imm(,ri, s): M[Imm + R[ri] * s],比例变址寻址
(rb,ri, s): M[R[rb] + R[ri] * s],比例变址寻址
Imm(rb,ri, s): M[Imm + R[rb] + R[ri] * s],比例变址寻址

mov指令

movb, movw, movl, movq 分别表示把1,2,4,8字节的数据从源位置复制到目标位置。x86-64 限制源位置和目标位置不能两个都是内存。大部分指令都会有这4种变种,但如pushq,popq,leaq等指令没有

movz,movs是0扩展和符号扩展指令,将较小的数从寄存器或内存转移到寄存器中。

leap指令

地址的赋值
leaq S,D: 将S所表示的地址值赋值给D,经常用来做一些简单的算法。比如z = x+4*y可能表示为leaq (%rdi, %rsi, 4), %rax

位移指令

sarq,shrq表示算术右移和逻辑右移。salq, shlq表示算术左移和逻辑左移,但由于补码的特性,他们的操作结果是一样的。

乘法指令

*x86-64还为128位操作提供有限支持,当imulq和mulq为双操作数时,是64位乘法;当为单操作数时,另一个乘数将视为%rax,而结果将存放在%rdx(高64位),%rax(低64位)中。

跳转指令

jmp表示跳转指令,一般汇编用一个标号来指定,如jmp .L1。也可以利用寄存器,如jmp *%rax表示跳转到%rax的值的地址,jmp *(%rax)表示跳转到%rax值对应的内存值的内存地址去。和SET一样,也有je,js,jle等指令

call指令

call指令用于函数调用,此时将会把将紧跟着当前地址后面的那条指令的地址压入栈,并吧要跳转的函数地址设置到PC。退出时用ret。

AT&T

一元操作中,操作数既是源也是目的。操作数可以是内存地址。

二元操作中,源操作是第一个,目标操作是第二个。如subq %rax, %rdx等价与%rdx = %rdx – %rax。如果第二个操作数是内存地址,则必须读出,执行,再写入。注:此时应该会生成多条机器指令,则该操作不是原子操作。否则i++可以写成addq $1, (%rax)岂不是原子操作?所以推断该操作不是原子操作。

入栈及出栈

x86-64中,栈中低地址是栈顶,高地址是栈底。pushq时%rsp减小,popq时%rsp增大。

tips

  1. GCC当switch的情况较多,且跨度较小的时候,会使用地址跳转表来翻译switch

  2. 当x86-64过程需要的存储空间超出寄存器能够存放的大小时,就回在栈上分配空间,这个部分称为过程的栈帧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lydia.na

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值