1 本章总述

1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器、数据类型和指令集;

2) 学习了程序如何将数据存储在不同的内存区域中 —— 程序开发人员需要知道一个变量是存储在运行时栈中, 亦或是在某个动态分配的数据结构中, 还是全局程序数据的一部分;

3) 程序是以指令序列来表示的, 每条指令都完成一个单独的操作; 部分程序状态, 比如寄存器和运行时栈, 对程序开发人员来说是直接可见的;

4) 编译器必须使用多条指令来产生和操作各种数据结构, 以及实现包括条件、循环和过程等在内的控制结构;

2 扩展内容

(1) C 语言中缺乏边界检查, 这就是的许多程序容易出现缓冲区溢出 —— 容易受到恶意入侵和攻击.

(2) 编译 C++ 和 C 的区别:

C++ 的早期实现只是简单地执行了从 C++ 源到 C 源的转换, 并对结果运行 C 编译器, 产生目标代码;
C++ 的对象用结构来表示, 类似于 C 中的struct;
C++ 的方法使用指向实现方法的代码的指针来表示的.

(3) Java 的编译方式:

Java 的目标代码是一种特殊的二进制表示 —— Java 字节码 —— 可以看作是虚拟机的机器级程序;
Java 用字节码作为程序的低级表示, 优势是: 相同的代码可以在许多不同的机器上执行, 只需要在不同的机器上安装 Java 虚拟机(JVM)即可;
Java 中还有一种称为 即时编译(Just-In-Time Compilation) 的方法, 动态地把字节代码序列翻译成机器指令, 当代码要执行多次时(比如在循环中), 这种方法执行起来更快.

需要注意的是: Java 虚拟机并不是直接用硬件实现的, 而是用软件解释器处理字节码, 模拟虚拟机的行为.


====== 华丽的分割线 - 第三章第三周作业 - ======

3 一些总结性的知识

gcc-S生成汇编代码, objdump -d反汇编程序, 生成可执行文件后, 文件变大 —— 因为包括了启动、终止程序信息, 以及操作系统交互信息.

3.1 机器级编程二种重要的抽象

(1) 指令集体系结构, 定义了处理器状态、指令的格式, 以及每条指令对状态的影响.

(2) 机器级程序使用的存储器地址是虚拟地址, 操作系统负责管理虚拟地址空间, 并将虚拟地址翻译成实际处理器存储器的物理地址.

3.2  IA32包含8个存储32位值的寄存器

(1) %eax、%edx、%ecx称为调用者保存寄存器, 过程P调用Q, Q可以覆盖他们.

(2) %ebx、%esi、%edi称为被调用者寄存器, Q须在覆盖前保存, 并在返回前恢复.

(3) 栈指针%esp始终保存着栈顶元素的地址, 压栈减小栈指针, 栈向下增长; 帧指针%ebp, 大多数信息的访问都是相对于帧指针的.

3.3 MOV类中指令将源操作数复制到目的操作数

源操作数指定一个立即数, 存储在寄存器或存储器中。目的操作数指定一个位置,寄存器或存储器地址。

(1) 有效地址: 立即数偏移Imm+基址寄存器R[Eb]+变址寄存器R[Ei]*比例因子s(1、2、4);

(2) 限制是两个操作数不能同时指向存储器位置;

(3) MOVS和MOVZ将较小的源数据复制到较大的数据位置, 高位符号扩展或零扩展.

4 栈帧结构

4.1 总体描述

IA32的程序使用堆栈支持过程的调用 (函数的调用), 在函数调用时会专门从堆栈中分出一块内存 (称为帧) 供函数使用.

传递给函数的参数由堆栈来保存, 帧则负责存储寄存器的状态、局部变量的内存分配的相关任务.

如果说函数P调用函数Q, 那么称P为调用者 (caller), Q是被调用者 (callee).

根据上述规则, 堆栈会给Q分配帧, 并且用两个指针 (分别存储在%ebp%ebp和%esp%esp中) 指示帧的开始和结束的位置.

4.2 其他特性

(1) 栈规则提供了一种机制, 每次函数调用都有它自己私有的状态信息 (保存的返回位置、栈指针和被调用者保存寄存器的内容), 因此每次递归其实就是一个栈深度不断增加的过程.

(2) 访问数组元素: movl  (%edx, %ecx, 4), %eax 通过首地址+偏移量得到实际地址访问;

(3) 读存储器比写存储器容易得多, 因此将只读变量溢出到存储器是合适的 —— 寄存器数量有限, 因此才会溢出到存储器.

(4) 数据对齐的优点:

(a) 对齐限制简化了形成处理器和存储器系统之间的硬件设计;
(b) 严格对齐后, 可用一个存储器用作读或写;
(c) 对齐数据以提高系统的性能.

(5) 指针的强制转换, 只是改变在内存中的解读方式. —— 很重要的一个理解.

5 对抗缓冲区溢出攻击的几种方式

(1) 栈随机化;
(2) 栈破坏检测: 利用一个金丝雀值完成;
(3) 限制可执行代码区域: 只保存编译器产生的代码的那部分存储器是可执行的, 其他部分可以被限制为只读、只写.

未完待续...

CSAPP 3 程序的机器级表示的更多相关文章

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

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

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

    CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作   如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类( ...

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

    程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈   x86-64的栈向低 ...

  4. Linux下程序的机器级表示学习心得

    Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为 ...

  5. CS:APP Chapter 3 程序的机器级表示-读书笔记

    3.1 程序的机器级表示 发展历史 Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体 ...

  6. 【CSAPP】三、程序的机器级表示

    本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...

  7. 六星经典CSAPP-笔记(3)程序的机器级表示

    1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个 ...

  8. 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...

  9. 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...

随机推荐

  1. 【zabbix告警监控】配置zabbix监控nginx服务

    zabbix监控nginx,nginx需要添加--with-http_stub_status模块 使用zabbix监控nginx,首先nginx需要配置开启ngx_status.但是我这边nginx安 ...

  2. 【译】浅谈SOLID原则

    SOLID原则是一种编码的标准,为了避免不良设计,所有的软件开发人员都应该清楚这些原则.SOLID原则是由Robert C Martin推广并被广泛引用于面向对象编程中.正确使用这些规范将提升你的代码 ...

  3. Spring Boot2解决idea console 控制台输出乱码

    Idea默认配置是采用GBK, 而项目工程文件采用的是UTF-8. 编码不一致,导致idea Console控制台输出乱码. 网上的解决方案,大都是直接修改Settings=>Editor=&g ...

  4. NET Framework项目移植到NET Core上遇到的一系列坑

    原文:NET Framework项目移植到NET Core上遇到的一系列坑 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  5. How to: Supply Initial Data for the Entity Framework Data Model 如何:为EF数据模型提供初始数据

    After you have introduced a data model, you may need to have the application populate the database w ...

  6. Android 项目优化(一):项目代码规范优化

    项目代码规范为主要包含:类,常量,变量,ID等命名规范:注释规范:分包规范:代码风格规范. 项目代码规范是软件开发过程中非常重要的优化环节. 目前的开发社区提供了很多的开发规范文档,阿里巴巴推出了&l ...

  7. 从0使用Ruby on Rails打造企业级RESTful API项目实战之我的云音乐

    本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTful API项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图. 课程简 ...

  8. HIFIMAN TWS600A听感小记——测评出街Man

    HIFIMAN TWS600A听感小记——测评出街Man 几年前蓝牙耳塞在大哥苹果的带领下有着掀翻小池塘的气势.蓝牙耳塞完全替代了我在通勤路上用的有线塞子,当时随便买了一副两百多元的塞子,低音轰头就算 ...

  9. CODING 2.0 服务升级:一站式服务体系助力企业研发上云

    近日,CODING 在 KubeCon 2019 上海站上正式推出了 DevOps 的一站式解决方案: CODING 2.0,除了进行 产品 及 产品理念 的升级,还对用户服务进行了整体升级,主要涵盖 ...

  10. Cocos2d-x.3.0开发环境搭建之—— 极简式环境搭建

    配置:win7 + VS2012 + Cocos2d-x.3.0 + Cocos Studio v1.4.0.1 使用此法可以方便的创建Cocos2d-x项目.如果需要运行Cocos2d-x引擎自带的 ...