【笔记】深入理解计算机系统

程序的机器级表示

编译器基于编程预言的规则、目标机器的指令集和操作系统遵循的惯例,经过一系列的阶段生成机器代码。GCC C预言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令。然后GCC调用汇编器和链接器,根据汇编代码生成可执行的机器代码。

用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的。对汇编代码的要求是能够阅读和理解编译器产生的代码,了解如何将C程序编译成这种形式的机器代码。

内容概要

1 首先快速浏览C语言,汇编代码以及机器代码之间的关系。

2 然后介绍X86-64的细节,从数据的表示和处理以及控制的实现开始。了解如何实现C语言中的控制结构,如if while switch语句。

3 之后讲到过程的实现,包括程序如何维护一个运行栈来支持过程间数据和控制的传递,以及局部变量的存储。

4 接着考虑在机器级如何实现像数组 结构和联合这样的数据结构。

5 有了这些机器级编程的背景知识,再来讨论内存访问越界的问题,以及系统容易遭受缓存区溢出攻击的问题。

6 最后,给出一些用GDB调式器检查机器级程序运行时行为的技巧。

要点笔记:

1 由于是从16位体系扩展成32位的,Intel用术语“字”表示16位数据类型。因此称32位数为“双字”,64位数位“四字”。

2 汇编代码:数据传送指令有四个变种,movb(传送字节),movw(传送字),movl(传送双字)和movq(传送四字)。

3 一个x86-64的中央处理器包含一组16个存储64位值的通用目的寄存器,用来存储整数数据和指针。他们的名字都以%r开头。最初的8086有8个16位寄存器,%ax到%sp。扩展到IA32架构时,这些寄存器也扩展层32位寄存器,标号从%eax到%esp。扩展到x86-64,原来的8个寄存器扩展成64位,标号从%rax到%rsp。

4 在常见的程序里不同的寄存器扮演不同的角色,其中最特别的是栈指针%rsp,用来指明运行时栈的结束位置。

5 过程: 过程是软件中的一种很重要的抽象。他提供了一种封装代码的方式,用一组指定的参数和一个可选的返回值实现了某种功能。然后可以在程序中的不同地方调用这个函数。

6 栈在过程调用中起到至关重要的作用。栈是一种数据结构,可以添加或删除值,不过要遵循“后进先出”的原则。通过push操作把数据压入栈中,通过pop操作删除数据。它具有一个属性:弹出的值永远是最近被压入而且仍然在栈中的值。在x86-64中,程序栈存放在内存中的某个区域。栈向下增长,这样一来,栈顶元素的地址是所有栈中元素地址中最低的,栈指针%rsp保存着栈顶元素的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值