2018-11-04 CSAPP 第三章读书笔记part1

第三章 程序的机器级表示

对于严谨的程序员来说,能够阅读和理解汇编代码仍是一项很重要的技能。

阅读编译器产生的汇编代码,需要具备的技能不同于手工编写汇编代码。——感觉阅读和编写在一个量级了,应该是阅读比较弱一点吧,(也许就是一个级别的)。

精通细节是理解更深和更基本概念的先决条件。

本章基于两种相关的机器语言:Intel IA32和x86-64,前者是当今大多数计算机的主导语言,而后者是前者在64位机器上运行的扩展。本章的内容:

先快速的浏览c语言、汇编语言以及机器代码之间的关系。

然后介绍IA32的细节,从数据的表示和处理以及控制的实现开始。了解c语言中的控制结构是如何实现的。

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

接下来,我们会考虑在机器级如何实现像数组、结构和联合这样的数据结构。

结尾,我们会给出一些用GDB调试器检查机器级程序运行时行为的技巧。

3.1 历史

Intel处理器的换代:

8086

80286

i386

i486

Pentium

PentiumPro

PentiumII

PentiumIII

Pentium4

Pentium4E

Core2

Corei7(Nehalem Sandy Bridge Haswell)。

这些所有的代都是Intel系列的,Intel系列本身有很多名字,比如x86,比如IA32,Intel系列中64位扩展称为x86-64。最常用的是x86。也就是说x86就是Intel每一代处理器的统称。

8086和80286的存储器模型都已经过时了,从i386开始提供的平坦寻址模式也是linux使用的模式,这是将存储空间看做一个大的字节数组。

看来i386是一个转折点,从这里开始系统扩展为32位,同时,GCC为32位执行的默认调用仍然假设是为i386机器产生的代码,Intel系列,x86,是向后兼容的,所以i386的可以执行的代码,后面的都可以执行。


摩尔定律


3.2 程序编码

提高gcc的优化级别,会使得产生的机器代码和初始源代码之间的关系非常难以理解。-O2,第二级优化是默认选择。这里是LMNOPQ的O,不是零。

机器代码的两种形式:目标代码,可执行代码。目标代码包含了所有的指令但还没有填入地址的全局值,后者是处理器执行的代码格式。

对于机器级编程来说,有两种抽象尤其重要:机器级编程的格式和行为,定义为指令集体系结构。机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。

能够理解汇编代码以及它与原始c代码的联系,是理解计算机如何执行程序的关键一部。

IA32机器代码和原始的c代码差别非常大。一些通常对c语言程序员隐藏的处理器状态是可见的:

程序计数器,PC,用%表示,指示要执行的下一条指令在存储器中的地址,这里的存储器是主存。

整数寄存器文件包含8个命名的位置,分别32位,可以保存:地址,程序状态,局部变量,函数返回值。

条件码寄存器保存着最近执行的算术或逻辑指令的状态信息。用来实现if和while等。

一组浮点寄存器存放浮点数据。

机器代码只是将存储器看成一个很大的、按字节寻址的数组。

程序存储器(program memeory)包含:程序的可执行机器代码(代码和数据区),操作系统需要的一些信息(应该也在代码和数据区),用来管理过程调用和返回的运行时栈(栈),以及用户分配的存储器块(堆)。

操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器(processor memory)中的物理地址。

gcc -O1 -s x.c 输出 汇编代码

gcc -O1 -c x.c 输出 目标代码

objdump -d x.o 反汇编机器代码

gdb 可以直接对机器代码使用

gcc -s产生的汇编代码中,所有以点开头的行都是用于指导汇编器和链接器的。

gcc和objdump产生的汇编代码是ATT风格,微机原理里面学习的是Intel风格。

有所不同,但本质没有改变。

3.3数据格式

Intel用术语word表示16位数据类型,32为double words,64位为quad words,这是由于最初Intel系列是从16位开始的。

ATT风格的汇编代码指令都有一个字符后缀,表面操作数的大小。Intel风格的汇编代码是没有的。


3.4访问信息

IA32的cpu中有8个32位的寄存器,%e是前缀,依次是:ax,cx,dx,bx,si,di,sp,bp。前6个可以看作是通用寄存器,大多数情况下。前3个和后3个的保存和恢复惯例不同。最后两个指向程序栈中重要位置的指针。

指令的源数据值可以以常数形式给出,或是从寄存器或存储器中读出。也就是,常数,寄存器,内存。这么记忆:绝大部分源数据类型都是从存储器中读,除了两种:$Imm和%exx,这两种格式分别是立即数和寄存器的值,任何其他的形式都是从存储器中读,计算的结果是存储器某一字节的地址。

IA32的一条限制:数据传送指令的两个操作数不能都指向存储器位置。

数据传送指令的源操作数在左,目的操作数在右(ATT风格),(Intel风格则相反)。

栈在程序的虚拟地址空间的上部,再往上就是内核虚拟空间了,栈底紧挨着内核虚拟空间,栈顶向下增长。%esp保存这栈顶元素的地址。

将一个双字压入栈,先将%esp减小4,然后将双字放入这多出来的4个字节的空间中。出栈则是先读出4个字节,然后%esp加4。

因为栈和程序代码以及其他形式的程序数据都是放在同样的存储器中(虚拟地址空间),所以程序用标准的存储器寻址方法访问栈内任意位置。

3.4.1操作数指示符

3种类型

1立即数

2寄存器

3内存引用


3.4.2数据传送指令

最简单形式的数据传送指令-MOV类

MOV类有四条指令组成:

movb movw movl 和movq



3.4.4 压入和弹出栈数据

最后两个数据传送操作可以将数据压入程序栈中,以及从程序栈中弹出数据。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容