原地址:https://www.cnblogs.com/disturbia/p/4869229.html

第三章 程序的机器级表示

3.1 历史观点

  • Intel处理器系列俗称x86,开始时是第一代单芯片、16位微处理器之一。
  • 每个后继处理器的设计都是后向兼容的——较早版本上编译的代码可以在较新的处理器上运行。
  • X86 寻址方式经历三代:

1  DOS时代的平坦模式,不区分用户空间和内核空间,很不安全

2  8086的分段模式

3  IA32的带保护模式的平坦模式

3.2 程序编码

gcc -01 -o p p1.c
  • -01 表示使用第一级优化。优化的级别与编译时间和最终产生代码的形式都有关系,一般认为第二级优化-02 是较好的选择。
  • -o 表示将p1.c编译后的可执行文件命名为p

3.2.1机器级代码

  • 计算机系统使用了多种不同形式的抽象,对于机器级编程来说,两种抽象尤为重要。第一种是机器级程序的格式和行为,定义为指令集体系结构(ISA),他定义了处理器状态、指令的格式,以及每条指令对状态的影响。
  • 几个处理器:

    • 程序计数器(CS:IP)
    • 整数寄存器(AX,BX,CX,DX)
    • 条件码寄存器(OF,SF,ZF,AF,PF,CF)
    • 浮点寄存器

3.2.2代码示例


在命令行上使用“-S”选项,就能得到C语言编译器产生的汇编代码:
unix> gcc -01 -S code.c
这会使GCC运行编译器产生一个汇编文件code.s,但不做其他进一步工作
如果在命令行上使用“-C”选项,GCC会编译并汇编该代码:
unix> gcc -01 -c code.c
这就会产生目标代码文件code.o,他是二进制格式,无法直接查看。

要查看目标代码文件的内容,需要使用反汇编器

unix> objdump -d code.o

机器代码和它的反汇编表示的一些特性:

  • IA32指令长度从1到15个字节不等。
  • 设计指令格式的方式是,从某个给定位置开始,可以将字节唯一的解码成机器指令。
  • 反汇编器只是基于机器代码文件中的字节序列来确定汇编代码,不需要访问程序的源代码或汇编代码。
  • 反汇编器使用的指令命名规则与GCC生成的汇编代码使用的有些差别。

3.3 数据格式

1.Intel中:

8 位:字节
16位:字
32位:双字
64位:四字

2.c语言基本数据类型对应的IA32表示

char   字节                 1字节
short     字              2字节
int  双字              4字节
long int  双字               4字节
long long int (不支持)     4字节
char *  双字                 4字节
float   单精度               4字节
double  双精度               8字节
long double 扩展精度     10/12字节

3.数据传送指令的三个变种:

  • movb 传送字节
  • movw 传送字
  • movl 传送双字

3.4 访问信息

3.4.1操作数指示符

大多数指令都有一个或多个操作数,指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。

操作数的三种类型

  • 立即数
  • 寄存器
  • 存储器

寻址方式:

1.立即数寻址方式

2.寄存器寻址方式

3.存储器寻址方式

  • 直接寻址方式
  • 寄存器间接寻址方式
  • 寄存器相对寻址方式
  • 基址变址寻址方式
  • 相对基址变址寻址方式

3.4.2 数据传送指令

mov类指令:将源操作数的值复制到目的操作数中。源操作数指定的值是一个立即数,存储在寄存器中或存储器中。目的操作数制指定一个位置,要么是一个寄存器,要么是一个存储器。

  • movb 传送字节
  • movw 传送字
  • movl 传送双字
  • movs 符号位扩展
  • movz 零扩展

push:把数据压入栈中

pop:删除数据

  • 后进先出
  • 栈指针指向栈顶元素
  • 栈朝低地址方向增长

3.4.3 数据传送示例

  • c语言中的指针其实就是地址,间接引用指针就是将该指针放在一个寄存器中,然后在存储器引用中使用这个寄存器
  • 局部变量通常保存在寄存器中,而不是存储器

3.5 算术和逻辑操作

3.5.1 加载有效地址

加载有效地址指令leal实际上就是movl指令的变形。它的指令形式是从存储器读取数据到寄存器,但实际根本没引用存储器。

3.5.2 一元操作和二元操作

一元操作:只有一个操作数,既是源又是目的,可以是一个寄存器,或者存储器位置。

二元操作:源操作数 目的操作数

  • 第一个操作数可以是立即数、寄存器或者存储器位置

  • 第二个操作数可以是寄存器或者存储器位置

  • 但是不能同时是存储器位置

3.5.3 移位操作

  • SAL 算术左移
  • SHL 逻辑左移
  • SAR 算术右移(补符号位)
  • SHR 逻辑右移(补0)

3.5.5 特殊的算术操作

3.6 控制

3.6.1 条件码

  • CF:进位标志

  • ZF:零标志

  • SF:符号标志

  • OF:溢出标志 

3.6.2 访问条件码

条件码不会直接读取,常用的使用方法有三种:

  • 可以根据条件码的某个组合,将一个字节设置为0或者1
  • 可以条件跳转到程序的某个其他的部分
  • 可以有条件地传送数据

执行比较指令,根据计算t=a-b设置条件码。

3.6.3 跳转指令及其编码

跳转指令会导致执行切换到程序中一个全新的位置。在汇编代码中,这些跳转的目的地通常用一个标号指明。

跳转指令有几种不同的编码,最常用的是PC(程序计数器)相关的。

jump分为:

  • 直接跳转:后面跟标号作为跳转目标
  • 间接跳转:*后面跟一个操作数指示符

当执行与PC相关的寻址时,程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身的地址。

3.6.4 翻译条件分支

将条件表达式和语句从c语言翻译成机器语言,最常用的方式就是结合有条件和无条件跳转

3.6.5 循环

汇编中没有do-while、while和for相应的指令存在,可以用条件测试和跳转组合起来实现循环的效果。大多数汇编器中都要先将其他形式的循环转换成do-while格式。

1.do-while循环

通用形式:

dobody-statementwhile(test-expr);

循环体body-statement至少执行一次。

可以翻译成如下条件和goto语句:

loop:body-statementt = test-expr;if(t)goto loop;

每次循环,程序会执行循环体的语句,然后执行测试表达式。

2.while循环

通用形式:

while (test-expr)body-statement

GCC的方法是使用条件分支,在需要时省略循环体的第一次执行:

if(!test-expr)goto done;
dobody-statementwhile(test-expr);
done:

接下来,这个代码可以直接翻译成goto代码:

t = test-expr;
if(!t)goto done:
loop:body-statementt = test-expr;if(t)goto loop;
done:

3.for循环

通用形式:

for(init-expr;test-expr;update-expr)
body-satamentdo-while形式:init-expr;
if(!test-expr)
goto done;
do{body-statementupdate-expr;}while(test-expr);
done:翻译成goto代码:
init-expr;
t=test-expr;
if(!t)goto done;
loop:body-statement
update-expr;
t= test-expr;
if(t)goto-loop;
done:

3.6.6 条件传送指令

实现条件操作的传统方法是利用控制的条件转移。

数据的条件转移是一种替代的策略。此方法先计算一个条件操作的两种结果,然后再根据条件是否满足从而选取一个。

只有在一些受限制的情况下,这种策略才可行,但如果可行,就可以用一条简单的条件传送指令来实现它。

条件传送指令更好地匹配了现代处理器的性能特性。

3.6.7 Switch语句

3.7 过程

3.7.1 栈帧结构

栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。

1.栈帧:

为单个过程分配的那部分栈称为栈帧。

2.最顶端的栈帧以两个指针界定:

  • 寄存器%ebp-帧指针

  • 寄存器%esp-栈指针

3.7.2转移控制

1.call

CALL指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。

返回地址是还在程序中紧跟在call后面的那条指令的地址。

2.ret

ret指从栈中弹出地址,并跳转到这个位置。

3.leave

这个指令使栈做好返回的准备

3.7.3 寄存器使用惯例

程序寄存器组是唯一能被所有过程共享的资源。

3.8 数组分配和访问

3.8.1 基本原则

3.8.2 指针运算

3.8.3 嵌套的数组

3.8.5 变长数组

3.9 异质的数据结构

创建数据类型机制的两种不同类型的对象:
●结构:用关键字struct声明,将多个对象集合到一个单位中

●联合:用关键字union声明,允许用几种不同的类型来引用一个对象。

3.10 综合:理解指针

(1)每个指针都对应一个类型

(2)每个指针都有一个值

(3)指针用&运算符创建

(4)操作符用于指针的间接引用

(5)数组与指针紧密联系

(6)指针也可以指向函数

3.11 应用:使用 GDB调试器

3.12 存储器的越界引用和缓冲区溢出

!对抗缓冲区溢出攻击

a.栈随机化

b.栈破坏检测

c.限制可执行代码区域

3.13 X86-64: 将IA32扩展到64位(了解知识)

3.14 浮点程序的机器级表示

浮点体系结构——存储模型、指令和传递规则的组合。(x87和SSE)

出现的问题:有部分和汇编相关的知识点理解起来有些困难,需要查阅相关学习资料才能理解部分。还有就是课后作业编译只会第一步,接下来的步骤不会,希望老师详解。

课后作业:

第三章程序的机器级表示相关推荐

  1. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  2. 第三章程序的机器级表示 学习报告

    第三章 程序的机器级表示 3.1 历史观点 Intel处理器系列俗称x86,开始时是第一代单芯片.16位微处理器之一. 每个后继处理器的设计都是后向兼容的--较早版本上编译的代码可以在较新的处理器上运 ...

  3. 第三章 程序的机器级表示

    程序的机器级表示 计算机执行机器代码,用字节序列编码低级的操作,包括处理数据.管理内存.读写存储设备上的数据,以及利用网络通信.编译器基于编程语言的规则.目标机器的指令集和操作系统遵循的惯例,经过一系 ...

  4. CSAPP:第三章程序的机器级表示1

    CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式   术语字(word)表示16位数据类型,32位数为双字(double words), ...

  5. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第三章 程序的机器级表示

    本章主要介绍了计算机中的机器代码--汇编语言.当我们使用高级语言(C.Java等)编程时,代码会屏蔽机器级的细节,我们无法了解到机器级的代码实现.既然有了高级语言,我们为什么还需要学习汇编语言呢?学习 ...

  6. CSAPP第三章——程序的机器级表示:学习笔记总结

    花了半个多月,补完王爽老师的汇编语言后,跟着CMU的视频课+课本,学完了第三章的知识,最深的感触就是CSAPP无论是视频还是书的质量都非常的硬,不愧它的盛名.(lab6和课后的家庭作业还没做,之后再补 ...

  7. 深入理解计算机系统 第3章 程序的机器级表示

    目录 第3章 程序的机器级表示 数据格式 操作数指示符 练习题 数据传送指令 习题3.4 访问信息 压入和弹出栈数据 算数和逻辑操作 移位操作 讨论 特殊的算数操作 问题 第3章 程序的机器级表示 数 ...

  8. 第 3 章 程序的机器级表示

    文章目录 第 3 章 程序的机器级表示 3.1 历史观点 3.2 程序编码 3.2.1 机器级代码 3.2.2 代码示例 3.2.3 关于格式的注解 3.3 数据格式 3.4 访问信息 3.4.1 操 ...

  9. 【《深入理解计算机系统》读书笔记(3)】 第3章 程序的机器级表示

    [时间]2021.11.19 [题目]<深入理解计算机系统>读书笔记(3)  第3章 程序的机器级表示 目录 一.简介 二.一些重点图 1.常见数据类型格式 2.16个整数寄存器 3.寄存 ...

最新文章

  1. python免费自学爬虫_这套Python爬虫学习教程,不到一天即可新手到进阶!免费领...
  2. window系统安装hexo
  3. 搜索引擎工作的基础流程与原理
  4. 数据标准化(归一化)
  5. Beyond Compare4长期使用方法
  6. 2017年内容安全十大事件盘点
  7. 华为手机销量超过苹果,华为能算是全球第二大手机厂家吗?
  8. 【CodeForces - 471B】MUH and Important Things (模拟,细节)
  9. 如何在PHP中实现链式方法调用
  10. Unity ScriptObject
  11. pytorch orchvision.transforms.Normalize
  12. sql2008java驱动_sqlserver2008 jar驱动
  13. java gbk 内码_JAVA 中文转GBK内码方法
  14. Android图片颜色混合算法
  15. CF - 659B. Qualifying Contest 排序+字符串
  16. html css网页代码,源码附上
  17. 管道与系统调用pipe
  18. 2020 Bioinformatics | GraphDTA: predicting drug target binding affinity with graph neural networks
  19. cfn-signal
  20. 极度快速的近似最近邻搜索算法(EFANNA)-学习笔记

热门文章

  1. java arraylist 复制_如何克隆ArrayList和复制其内容?
  2. 鸿蒙华为手机2020上市,华为12月双喜临门:Mate40上市,发布鸿蒙手机,2020完美收官!...
  3. 求解(树的子结构问题-何海涛100题)
  4. 数学建模算法学习笔记 已完结
  5. 有限元三角形单元的等效节点力
  6. AtCoder Beginner Contest 272「A」「B」「C」「D bfs」「E 思维」
  7. 马云卸任CEO演讲:明天起生活将是我的工作
  8. 耶鲁大学计算机科学专业 录取,杜克大学和耶鲁大学计算机科学专业申请对比...
  9. 算法训练营 重编码_您可能不需要$ 15K的编码训练营
  10. Win10修改msconfig后无法开机怎么办?