3 程序的机器级表示 2017 年 3 月 11 日 11: 计算机执行机器代码, 用字节序列编码低级的操作, 包括处理数据 管理存储器 读写存储在设备上的数据, 以及利用网络通信 通常情况下, 现代的优化编译器产生的代码至少与一个熟练的汇编语言程序员手工编写的代码一样有

Similar documents
Microsoft PowerPoint - lec11 [兼容模式]

Static Enforcement of Security with Types

gcc 对整型和浮点型参数传递的汇编码生成特点分析 张昱 1. 相关资料 关于浮点数 (Floating-point) 的存储表示 : 浮点数的存储目前广泛采用 IEEE 754 标准 (1980 年 Intel 提出, 1985 年被 IEEE 采纳,

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

L15 MIPS Assembly

幻灯片 1

微机原理(计算机原理与接口技术)

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ]


主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2

数据库系统概论

1 CPU interrupt INT trap CPU exception

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D204C696E757820BBE3B1E0D3EFD1D4BFAAB7A2D6B8C4CF2E646F63>

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Guava学习之Resources

chap07.key

M8Rxxx 指令集说明 Version 年 11 月 上海磐芯电子有限公司 SHANGHAI MASSES ELECTRONIC Co., Ltd. 本公司保留对产品在可靠性, 功能和设计方面的改进作进一步说明的权利 说明文档的更改, 恕不另行通知

数据库系统概论

数据库系统概论

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

µÚ¶þÕ µ¥´¦ÀíÆ÷Ìåϵ½á¹¹

CH559指令周期.doc

Microsoft PowerPoint sun-program2.ppt [Compatibility Mode]

幻灯片 1

ARM中C和汇编混合编程及示例.doc

PowerPoint 演示文稿

第1章 99

Microsoft PowerPoint sun-arm isa2.ppt [Compatibility Mode]

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式]

没有幻灯片标题

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

一 汇编语言计算机基础 从事计算机科学方面的工作, 汇编语言是我们必不可少缺的基础 我们的工作平台 研究对象都是机器, 而汇编语言是人和计算机沟通的最直接方式, 它描述了机器最终所要执行的指令序列 学习汇编语言可以让你充分获得底层编程的体验, 深刻理解机器运行程序的机理 二 基础知识 1. 汇编语言

ROP_bamboofox.key

飞利信 MCU 芯片遵循的开源指令集 Rv32IMC 标准特点中文介绍 1 开源指令集 Rv32IMC 概述标准 ISA 扩展是由单个字母构成的名字 例如, 基本整数核心的最前面 4 个标准扩展是 : M 表示整数乘法和除法, A 表示原子性存储器指令, F 表示单精度浮点指令, D 表示双精度浮点

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

第5章:汇编语言程序设计

RISC-V 相关技术文档 1 RV32I 基本整数指令集 1.1 基本整数子集的程序员模型有 31 个通用寄存器 x1~x31, 它们保存了整数数值 寄存器 x0 是硬件连线的常数 0 没有硬件连线的子程序返回地址连接寄存器, 但是在一个过程调用中, 标准软件调用约定使用寄存器 x1 来保存返回地

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th

嵌入式系统设计与应用 Pengju XJTU 2017 第五章程序设计与分析 (2) 西安交通大学电信学院 任鹏举

Principles of Computers

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11

Microsoft Word - AT&T2_bold.doc

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

共同构成 16 位数据存储单元的地址 当 CPL=1 时, 将堆栈指针 SP 的 16 位地址 与指令中的 7 位地址相加, 形成 16 位的数据存储器地址 (2) 当 SP=0100h, 偏移地址为 50h 时, 寻址 0150h 单元 ; 当 DP=2, 偏移地址为 50h 时, 寻址 0150

2.1 信息存储 2016 年 3 月 3 日 9:32 1. 把位组合在一起, 再加上某种解释, 即给不同的可能位模式赋予含义, 我们就能够表示任何有限 集合的元素 2. 无符号编码基于传统的二进制表示法, 表示大于或者等于零的数字 ; 补码编码是表示有符号整数的最常见的方式, 有符号整数就是可以

linux 下的缓冲区溢出 裴士辉 QQ:

Slide 1

KV-cache 1 KV-cache Fig.1 WorkflowofKV-cache 2.2 Key-value Key ; Key Mem-cache (FIFO) Value Value Key Mem-cache ( Value 256B 100 MB 20%

第十章 数模转换与模数转换接口及其应用

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

PowerPoint Presentation

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

Microsoft Word - em78 sub program.doc

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft Word - Ö¸Á.doc

Pengju 嵌入式系统设计与应用 第五章程序设计与分析 (2) 西安交通大学电信学院 任鹏举

数据库系统概论

378高雄市都市計畫說明書

无类继承.key

.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident "GCC: (GNU) egcs /Linux (egcs release)" 修改图 6.5 中计算声明名字

Linux kernel exploit研究和探索

Microsoft PowerPoint - chx09_org04_isa.ppt

一 学 校 基 本 情 况 目 录 二 部 门 预 算 报 表 ( 一 ) 收 支 总 表 ( 二 ) 收 入 总 表 ( 三 ) 支 出 总 表 ( 四 ) 财 政 拨 款 支 出 表 三 部 门 预 算 报 表 说 明 ( 一 ) 收 支 总 表 说 明 ( 二 ) 收 入 总 表 说 明 (

目 录 一 学 校 基 本 情 况 二 2016 年 预 算 报 表 ( 一 ) 中 南 大 学 收 支 预 算 总 表 ( 二 ) 中 南 大 学 收 入 预 算 表 ( 三 ) 中 南 大 学 支 出 预 算 表 ( 四 ) 中 南 大 学 财 政 拨 款 支 出 预 算 表 三 2016 年

信息参考

Microsoft Word - 15dbtb007

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

3.3.2 算术运算指令 数据类型 : 无符号和有符号整数 无符号数又分成 : 无符号二进制数 ; 无符号压缩十进制 :1 字节表示 2 个十进制数 ; 无符号非压缩十进制 :1 字节表示 1 个十进制数 有符号数 : 有符号二进制数 用补码表示 2015 年 3 月 26 日星期四 11 时 3

<4D F736F F D B8BDBCFE4220D7A8D2B5BBF9B4A1D3EBBACBD0C4BFCEB3CCC3E8CAF62E646F6378>

概述 基于 Cortex-M3 内核的 STM32F103 系列单片机, 并没有浮点运算协处理器 在 STM32F103 上进行的浮点运算都是软件模拟实现 考虑到加入浮点运算库需要大约 10K 左右的 FLASH 空间 ( 即 <math.h> 对应的数学库 ), 而且浮点运算速度较慢,EC30-E

Microsoft PowerPoint - compiler

Andes Technology PPT Temp


Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

大侠素材铺



Microsoft PowerPoint - RuntimeEnvII [Compatibility Mode]

《C语言程序设计》教材习题参考答案

微机第02章1(指令寻址)

Microsoft PowerPoint - 第01章 基础知识.pptx

Microsoft Word - Delta Controller ASCII_RTU_SC

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

PowerPoint Presentation

Microsoft PowerPoint ren-advanced topics [兼容模式]

Microsoft PowerPoint - 微原-第3章3.ppt [兼容模式]

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品

Microsoft Word 箕æ−¥ï¼‹å®ı稿;

98年度即測即評學科測試與即測即評即發證技術士技能檢定簡章

Transcription:

3 程序的机器级表示 2017 年 3 月 11 日 11:29 2. 3. 4. 计算机执行机器代码, 用字节序列编码低级的操作, 包括处理数据 管理存储器 读写存储在设备上的数据, 以及利用网络通信 通常情况下, 现代的优化编译器产生的代码至少与一个熟练的汇编语言程序员手工编写的代码一样有效 用高级语言编写的程序可以在很多不同的机器上编译和执行, 而汇编代码则是与特定机器密切相关的 学习机器代码的意义在于, 以适当的命令行选项调用编译器, 编译器就会产生一个以汇编代码形式表示的输出文件, 通过阅读这些代码, 我们能够理解编译器的优化能力, 并分析代码中隐含的低效率 分区 深入理解计算机系统 笔记的第 1 页

3.1 历史观点 2017 年 3 月 11 日 11:40 Linux 使用平坦寻址 (float addressing), 使程序员将整个存储空间看作一个大 的字节数组 分区 深入理解计算机系统 笔记的第 2 页

3.2 程序编码 2017 年 3 月 11 日 11:40 2. 3. 4. 5. 6. 对于机器级编程来说, 计算机系统中的两种抽象尤为重要 : a. 机器级程序的格式和行为, 定义为指令集体系结构 (Instruction set architecture, ISA), 它定义了处理器状态 指令的格式, 以及每条指令对状态的影响 ; b. 机器级程序使用的存储器地址是虚拟地址, 提供的存储器模型看上去是一个非常大的字节数组, 存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来 处理器状态 : a. 程序计数器 (PC, %eip), 指示将要执行的下一条指令在存储器中的地址 ; b. 整数寄存器, 包含八个命名的位置, 分别存储 32 位的值 ; c. 条件码寄存器, 保存着最近执行的算术或逻辑指令的状态信息 ; d. 一组浮点寄存器, 存放浮点数据 ; 程序存储器 (program memory), 包含程序的可执行代码, 操作系统需要的一些信息, 用来管理过程调用和返回的运行时栈, 以及用户分配的存储器块 ( 如用 malloc 分配的 ) 程序存储器用虚拟地址来寻址, 在任意给定时刻, 只认为有限的一部分虚拟地址是合法的 虽然 IA32 的 32 位地址可以寻址 4GB 的地址范围, 但是通常一个程序只会访问几兆字节 操作系统负责管理虚拟地址空间, 将虚拟地址翻译成实际处理器存储器 (processor memory) 中的物理地址 汇编代码不区分有符号数或无符号数, 不区分各种类型的指针, 甚至不区分指针和整数 一条机器指令只执行一个非常基本的操作 分区 深入理解计算机系统 笔记的第 3 页

3.3 数据格式 2017 年 3 月 11 日 16:02 2. 由于是从 16 位体系结构扩展成 32 位的,Intel 用 字 (word) 表示 16 位数据类型 因此,32 位数称为 双字 (double words), 称 64 位数为 四字 (quad words) 大多数 gcc 生成的汇编代码指令都有一个字符后缀, 表明操作数的大小 : a. movb: 传送字节 ; b. movw: 传送字 ; c. movl: 传送双字 分区 深入理解计算机系统 笔记的第 4 页

3.4 访问信息 2017 年 3 月 11 日 16:09 一个 IA32 CPU 包含一组 8 个存储 32 位值的寄存器, 如下图 : 2. a. 在大多数情况下, 前六个寄存器都可以看作是通用寄存器, 对它们的使用没有限制 之所以说是在大多数情况下, 是因为有些指令以固定的寄存器作为原寄存器和 / 或目的寄存器 ; b. 在处理过程中, 对 %eax %ecx %edx 的保存和恢复惯例不同于 %ebx %edi 和 %esi; c. %esp %ebp 保存着指向程序栈中重要位置的指针, 只有根据栈管理的标准惯例才能修改这两个寄存器中的值 ; d. 为了后向兼容 8008 和 8080, 字节操作指令可以独立的读写前四个寄存器的两个低位字节, 当一条字节指令更新这些单字节 寄存器元素 中的一个时, 该寄存器余下的 3 个字节不会改变, 类似的字操作指令读写每个寄存器的低 16 位也有这个特性 各种寻址方式 : 分区 深入理解计算机系统 笔记的第 5 页

3. 数据传送指令 : a. 源操作数指定的值是一个立即数 存储在寄存器或者存储器中的值 ; b. 目的操作数指定一个位置, 指向寄存器或存储器 ; c. IA32 限制传送指令的两个操作数不能都指向存储器位置 源操作数和目的操作数可能的组合如下 : 4. 5. 6. 7. 8. 9. MOVS 和 MOVZ 指令类都是将一个较小的源数据复制到一个较大的数据位置, 高位用符号位扩展或零扩展, 值得注意的是 movsbl 会改变其他三个字节, 与 movb 具有不一样的特性 栈指针 %esp 保存着栈顶元素的地址 任何存储在栈顶之外的数据都被认为是无效的 pushl, 压栈,pushl %ebp 相当于 subl, $4 %esp movl %ebp, (%esp) popl, 出栈,popl %eax 相当于 movl (%esp), %eax addl $4, %esp 因为栈和程序代码以及其他形式的程序数据都是放在同样的存储器中, 所以程序可以用标准的存储器寻址方式访问栈内任意位置 间接引用指针就是将该指针放在一个寄存器中, 然后再存储器应用中使用这个寄存器 其次, 局部变量通常是保存在寄存器中, 而不是存储器中 寄存器访问比存储器访问要快得多 分区 深入理解计算机系统 笔记的第 6 页

3.5 算术和逻辑操作 2017 年 3 月 11 日 16:09 一些整数和逻辑操作 : 2. 3. a. 加载有效地址 leal 指令实际上是 movl 指令的变形, 它的指令形式是从存储器读数据到寄存器, 但实际上它根本就没有引用存储器, 假设 %edx 的值为 x,leal 7(%edx,%edx,4),%eax 将设置 %eax 的值为 5x+7 b. 二元操作中的第二个操作数即是源又是目的 第一个操作数和第二个操作数引用位置的限制与 movl 指令一致 ; c. 移位量用单个字编码, 因为只允许进行 0~31 位的移位 移位量可以是一个立即数或存放在 %cl 中的值 移位操作的目的操作数可以是一个寄存器或存储器位置 汇编指令与 C 语言源代码中的顺序不同 通常, 编译器产生的代码中, 会用一个寄存器存放多个程序值, 还会在寄存器之间传送程序值 特殊的算数操作 : 分区 深入理解计算机系统 笔记的第 7 页

divl 指令执行前, 通常会把 %edx 设置为 0 分区 深入理解计算机系统 笔记的第 8 页

3.6 控制 2017 年 3 月 11 日 16:55 2. 3. 4. 机器代码提供两种基本的低级机制来实现有条件的行为 : 测试数据值, 然后根据测试结果来改变控制流或者数据流 数据相关的控制流是实现有条件行为的更通用和更常见的方法 用 jump 指令可以改变一组机器代码指令的执行顺序,jump 指令指令控制应该被传递到程序的哪个其他部分, 可能是依赖于某个测试的结果 编译器必须产生指令序列, 这些指令序列构建在这种实现 C 语言控制结构的低级机制之上 除了整数寄存器,CPU 还维护着一组单个位的条件码寄存器, 它们描述了最近的算术或逻辑操作的属性 可以检测这些寄存器来执行条件分支指令, 最常用的条件码如下 : a. CF: 进位标志 最近的操作使最高位产生了进位 可以用来检查无符号操作数的 溢出 ; b. ZF: 零标志 最近的操作得到的结果为 0; c. SF: 符号标志 最近的操作得到的结果为负数 ; d. OF: 溢出标志 最近的操作导致一个补码正溢出或者负溢出 值得注意 : 5. a. leal 指令不改变任何条件码 ; b. 逻辑操作, 例如 XOR, 进位标志和溢出标志会设置成 0; c. 移位操作, 进位标志将设置为最后一个被移出的位, 而溢出标志设置为 0; d. inc 和 dec 指令会设置溢出和零标志, 但不会改变进位标志 ; e. CMP 和 TEST 指令只设置条件码而不改变任何其他寄存器 条件码通常不会直接读取, 常用的使用方法有三种 : a. 可以根据条件码的某个组合, 将一个字节设置为 0 或者 1(SET 指令, 目的操作数是 8 个单字节寄存器元素之一或存储一个字节的储存器位置 ); 分区 深入理解计算机系统 笔记的第 9 页

6. 7. b. 可以条件跳转到程序的某个其他的部分 ; c. 可以有条件的传送数据 跳转指令会导致执行切换到程序中一个全新的位置 在汇编代码中, 这些跳转的目的地通常用一个标号指明 在产生目标代码文件时, 汇编器会确定所有带标号指令的地址, 并将跳转目标编码为跳转指令的一部分 jmp 指令是无条件跳转, 它可以是直接跳转, 即跳转目标是作为指令的一部分编码的 ; 也可以是间接跳转, 即跳转目标是从寄存器或存储器位置中读出的 其他跳转指令都是有条件的, 条件跳转只能是直接跳转 8. 跳转指令有几种不同的编码, 但是最常用的都是 PC 相关的, 两种方法描述如下 : a. ( 常用 ) 将目标指令的地址与紧跟在跳转指令后面那条指令的地址之间的差作为编码, 这些地址的偏移量可以编码为 1 2 或 4 个字节 ; b. 给出 绝对地址, 即给出 4 个字节直接指定目标 分区 深入理解计算机系统 笔记的第 10 页

9. 10. 汇编器和链接器会选择适当的跳转目的编码 当执行与 PC 相关的寻址时, 程序计数器的值是跳转指令后面的那条指令的地址, 而不是跳转指令本身的地址 通过使用与 PC 相关的跳转目标编码, 指令编码很简洁, 而且目标代码可以不做改变就已到存储器中的不同位置 翻译条件分支 : C 语言通用模版 : C 语言表示的汇编形式 : 1 控制的条件转移为循环翻译成机器代码提供了基本机制 大多数汇编器根据一个循环的 do-while 形式来产生循环代码, 即使在实际情况中这种形式用的比较少 其他的循环会首先转换成 do-while 形式, 然后再编译成机器代码 : a. do-while 循环 : b. while 循环 : 分区 深入理解计算机系统 笔记的第 11 页

c. for 循环 : 等价于 12. 实现条件操作的传统方法是利用控制的条件转移 这种机制简单而通用, 但是在现代的处理器上, 它可能会非常的低效率 数据的条件转移是一种替代的策略 这种方法先计算一个条件操作的两种结果, 然后根据条件是否满足从而选择一个 只有在一些受限制的情况下, 这种策略才可行, 但是如果可行, 就可以用一条简单的条件传送指令来实现它 条件传送指令更好地匹配了现代处理器的性能特性, 通过重叠指令的步骤来获得高性能, 要实现做到这一点, 要求能够事先确定要执行指令的序列, 这样才能保持流水线中充满了带执行的指令 分区 深入理解计算机系统 笔记的第 12 页

处理器采用非常精密的分支预测逻辑试图猜测每条跳转指令是否会执行 无论测试的数据是什么, 编译出来使用条件传送的代码所需的时间大约都是 14 个时间周期 控制流不依赖于数据, 这使得处理器更容易保持流水线是满的 不是所有的条件表达式都可以用条件传送来编译, 使用条件传送也不是总会改进代码的效率, 编译器必须考虑浪费的计算和由于分支预测错误所造成的性能处罚之间的相对性能 13. switch 语句跳转表是一个数组, 表项 i 是一个代码段的地址, 这个代码段实现了当开关索引值等于 i 时应当采取的动作 分区 深入理解计算机系统 笔记的第 13 页

分区 深入理解计算机系统 笔记的第 14 页

3.7 过程 ( 其实就是函数的使用 ) 2017 年 3 月 11 日 21:49 2. 一个过程调用包括将数据 ( 以过程参数和返回值的形式 ) 和控制从代码的一部分传递到另一部分 另外, 它还必须在进入时为过程的局部变量分配空间, 并在退出时释放这些空间 大多数机器, 包括 IA32, 只提供转移控制到过程和从过程中转移出控制这种简单地指令 数据传递 局部变量的分配和释放通过操纵程序栈来实现 IA32 程序用程序栈来支持过程调用 机器用栈来传递过程参数 存储返回信息 保存寄存器用于以后恢复, 以及本地存储 为单个过程分配的那部分栈称为栈帧, 结构如下 : 分区 深入理解计算机系统 笔记的第 15 页

3. 4. 最顶端的帧以两个指针界定,%ebp 为帧指针,%esp 为栈指针, 当程序执行时, 栈指针可以移动, 因此大多数信息的访问都是相对于帧指针 将栈指针的值减小适当的值可以分配没有指定初始值的数据的空间 类似的, 可以通过增加栈指针来释放空间 转移控制指令 : 5. 6. 程序寄存器组是唯一能被所有过程共享的资源 虽然在给定时刻只能有一个过程时候活动的, 但是我们必须保证当一个过程 ( 调用者 ) 调用另一个过程 ( 被调用者 ) 时, 被调用者不会覆盖某个调用者稍后会使用的寄存器的值 IA32 采用了一组统一的寄存器使用惯例, 所有的过程都必须遵守, 包括程序库中的过程 根据惯例,%eax %edx 和 %ecx 被划为调用者保存寄存器 ;%ebx %esi 和 %edi 被划为被调用者保存寄存器, 这意味着被调用者覆盖这些寄存器的值之前先把他们保存到栈中, 并在返回前恢复它们 递归调用一个函数本身与调用其他函数是一样的 分区 深入理解计算机系统 笔记的第 16 页

3.8 数组分配和访问 2017 年 3 月 12 日 13:14 对于数据类型 T 和整型常数 N, 声明如下 : 2. 3. 它有两个效果 首先, 它在存储器中分配一个 L*N 字节的连续区域 ; 这里 L 是数据类型 T 的大小 ( 单位为字节 ), 用 x A 来表示起始位置 其次, 它引入了标识符 A; 可以用 A 作为指向数组开头的指针, 这个指针的值就是 x A 可以用从 0 到 N-1 之间的整数索引来访问数组元素 数组元素 i 会被存放在地址为 IA32 的存储器引用指令可以用来简化数组访问 当我们创建数组的数组时, 数组分配和引用的一般原则也是成立的 数组元素在存储器中按照 行优先 的顺序排列, 要访问多维数组的元素, 编译器会以数组起始为基地址,( 可能需要经过伸缩的 ) 偏移量为索引, 产生计算期望的元素的偏移量, 然后使用某种 MOV 指令 的数组元素 D[i][j] 的存储器地址为 引用变长数组只需要对定长数组做一点概括 动态的版本必须用乘法指令对 i 伸展 n 倍, 而不能用系列的移位和加法 在一些处理器中, 乘法会招致严重的性能处罚, 但是这种情况下不可避免 分区 深入理解计算机系统 笔记的第 17 页

3.9 异质的数据结构 2017 年 3 月 12 日 13:14 2. 3. 4. 常见的, 将指向结构的指针从一个地方传递到另一个地方, 而不是复制它们 为了访问结构的字段, 编译器产生的代码要将结构的地址加上适当的偏移 结构的各种各个字段的选取完全是在编译时处理的 机器代码不包含关于字段声明或字段名字的信息 许多计算机系统对基本数据类型合法地址做出来一些限制, 要求某种类型对象的地址必须是某个值 K( 通常是 2 4 或 8) 的倍数 这种对齐限制简化了形成处理器和存储器系统之间接口的硬件设计 确保每个数据类型都按照指定方式组织和分配, 即每种类型的对象都满足它的对齐限制, 就可保证实施对齐 分区 深入理解计算机系统 笔记的第 18 页

3.10 综合 : 理解指针 2017 年 3 月 12 日 13:14 2. 3. 4. 5. 6. 7. 每个指针都对应一个类型 每个指针都有一个值, 特殊的 NULL(0) 值表示该指针没有指向任何地方 指针用 & 运算符创建 运算符 * 用于指针的间接引用 数组与指针紧密联系 将指针从一种类型强制转换为另一种类型, 只改变它的类型, 而不改变它的值 指针也可以指向函数 函数指针的值是该函数机器代码表示中第一条指令的地址 分区 深入理解计算机系统 笔记的第 19 页

3.12 存储器的越界引用和缓冲区溢出 2017 年 3 月 12 日 13:53 对抗缓冲区溢出攻击 : a. 栈随机化, 地址空间布局随机化 (ASLR) 的一种 b. 栈破坏检测 c. 限制可执行代码区域 分区 深入理解计算机系统 笔记的第 20 页

3.13 x86-64: 将 IA32 扩展到 64 位 2017 年 3 月 12 日 13:53 一些关键的区别 : a. 没有看到 movl 和 addl 指令, 只看到 movq 和 addq 指针和声明为长整数的变量都是 64 位的 b. 寄存器为 64 位的 过程将返回值放在 %rax 中 c. 没有生成栈帧 d. 传递参数是通过寄存器而不是栈传递, 这就不需要从存储器中读取参数 2. 访问数据 : 3. x86-64 的一个不同寻常的特性是能够访问栈指针之外的存储器 4. x86-64 遵循一组更严格的对齐要求 对于任何需要 K 字节的标量数据类型来说, 它的起始地址必须是 K 的倍数 分区 深入理解计算机系统 笔记的第 21 页