0
点赞
收藏
分享

微信扫一扫

【CSAPP】程序的机器级表示:基础知识


【CSAPP】程序的机器级表示:基础知识_CSAPP

目录

​​0x00  英特尔x86处理器(Intel x86 Processors)​​

​​0x01  因特尔x86的演变:里程碑(Intel x86 Evolution: Milestones)​​

​​0x02  程序就像是食谱(Programs are like recipes)​​

​​0x03  冯诺依曼建筑(Von Neumann Architecture)​​

​​0x04  汇编/机器码视图:Assembly/Machine Code View ​​

​​0x05  编译系统(Compilation System)​​

​​0x06 将C语言转换为目标代码(Turning C into Object Code)​​

​​0x07  汇编和二进制编码(Assembly and Binary code)​​

​​0x08  架构 - ISA指令集架构(Architecture - ISA: instruction set architecture)​​

​​0x09  定义(Definitions)​​

​​0x0A  编译器命令(Compiler command)​​

​​0x0B  使用GDB(Use GDB)​​

​​0x0C 机器指令示例(Machine Instruction Example)​​

​​0x0D 反汇编目标代码(Disassembling Object Code)​​

​​0x0E 穿插拆解(Alternate Disassembly)​​

​​0x0F  x86-64 整数寄存器(x86-64 Integer Registers)​​

​​0x10  一些历史:IA32寄存器(Some History: IA32 Registers)​​

​​ 0x11 移动数据(Moving Date)​​

​​0x12  movq 操作数组合(movq Operand Combinations)​​

​​0x13  简单内存寻址模式(Simple Memory Addressing Modes)​​

​​0x14  理解 Swap ( )​​

​​0x15  完整的内存寻址模式(Complete Memory Addressing Modes)​​

​​0x16  地址计算指令(Address Computation Instruction)​​

​​0x17  一些算术运算(Some Arithmetic Operations)​​

​​0x18  汇编特征:数据类型(Assembly Characteristics: Data Types)​​

​​0x19  Assembly Characteristics: Operations​​

​​0x1A  Object Code​​

0x00  英特尔x86处理器(Intel x86 Processors)

主导市场:

笔记本电脑、台式机、服务器。

进化的设计:

向后兼容,直到1978年推出的8086 - 随着时间的推移,增加了更多的功能。

复杂指令集计算机(CISC)

支持许多不同格式的指令。

精简指令集计算机(RISC)的性能难以匹敌!

但是英特尔已经做到了! - 在速度方面。

🔍 ​​RISC vs. CISC​​

0x01  因特尔x86的演变:里程碑(Intel x86 Evolution: Milestones)

【CSAPP】程序的机器级表示:基础知识_CSAPP_02

【CSAPP】程序的机器级表示:基础知识_Code_03

0x02  程序就像是食谱(Programs are like recipes)

【CSAPP】程序的机器级表示:基础知识_Assembly_04

0x03  冯诺依曼建筑(Von Neumann Architecture)

现代计算机的一个常见模型

指令以二进制表示,就像数据一样

指令和数据存储在存储器中

【CSAPP】程序的机器级表示:基础知识_Assembly_05

0x04  汇编/机器码视图:Assembly/Machine Code View 

【CSAPP】程序的机器级表示:基础知识_Code_06

PC: 程序计数器:① 下一条指令的地址    ② 被称为 "RIP" (x86-64)

寄存器文件: 大量使用的程序数据

条件代码:① 存储最近的算术或逻辑操作的状态信息    ② 用于条件性分支

内存:  ①字节寻址阵列   ② 代码和用户数据    ③ 支持程序的堆栈

0x05  编译系统(Compilation System)

将高级C程序翻译成二进制代码,由处理器读取和执行。

【CSAPP】程序的机器级表示:基础知识_Code_07

0x06 将C语言转换为目标代码(Turning C into Object Code)

【CSAPP】程序的机器级表示:基础知识_Assembly_08

0x07  汇编和二进制编码(Assembly and Binary code)

【CSAPP】程序的机器级表示:基础知识_Assembly_09

汇编:  ① 二进制代码的文本(符号)表示   ② 计算机硬件无法理解    ③ 一系列指令

操作代码: ① 二进制格式的指令序列,可由机器读取。 ② 它将被解析到集成电路上

【CSAPP】程序的机器级表示:基础知识_CSAPP_10

指令:工作的基本单位

指令指定: ① 要在CPU上执行的操作或操作码    ② 源操作数和结果的目的地

0x08  架构 - ISA指令集架构(Architecture - ISA: instruction set architecture)

软件和硬件之间的契约 / 接口

① 操作和存储位置(寄存器)的功能定义。

② 精确描述了软件如何调用和访问硬件的操作和存储。

ISA规定了汇编的语法和语义 

ISA是一个新的抽象层。

① ISA规定了硬件提供的东西,而不是它的实现方式。

② 隐藏了CPU实现的复杂性。

③ 不需要改变软件(我们可以在8086(1978)和奔腾4(2003)中运行软件,因为它们是x86 ISA的实现)

0x09  定义(Definitions)

【CSAPP】程序的机器级表示:基础知识_Assembly_11


架构: (ISA:指令集结构)一个处理器设计中需要理解或编写汇编/机器代码的部分。例如:指令集规范、寄存器。 - 微架构。架构的实现。例如:高速缓存大小和核心频率。

代码形式: 机器代码:处理器执行的字节级程序     ② 汇编代码:机器代码的文本表示

ISA实例: ① 英特尔:x86、IA32、Itanium、x86-64 - ARM  ② 几乎所有的手机上都有在使用

【CSAPP】程序的机器级表示:基础知识_Assembly_12

0x0A  编译器命令(Compiler command)

【CSAPP】程序的机器级表示:基础知识_CSAPP_13

  (assembly - 汇编     assembler - 汇编器    Linker - 链接器)

0x0B  使用GDB(Use GDB)

【CSAPP】程序的机器级表示:基础知识_寄存器_14

0x0C 机器指令示例(Machine Instruction Example)

【CSAPP】程序的机器级表示:基础知识_CSAPP_15

0x0D 反汇编目标代码(Disassembling Object Code)

【CSAPP】程序的机器级表示:基础知识_操作系统_16

0x0E 穿插拆解(Alternate Disassembly)

【CSAPP】程序的机器级表示:基础知识_CSAPP_17

 ❓ 那些东西可以被拆解?

【CSAPP】程序的机器级表示:基础知识_Assembly_18

① 任何可以被解释为可执行代码的东西

② 反汇编程序检查字节并重建汇编的源代码

0x0F  x86-64 整数寄存器(x86-64 Integer Registers)

可以引用低位字节序(大小端)(low-order) 4 字节。(也可以引用 low-order 1&2 字节)。

0x10  一些历史:IA32寄存器(Some History: IA32 Registers)

【CSAPP】程序的机器级表示:基础知识_操作系统_19

 0x11 移动数据(Moving Date)

【CSAPP】程序的机器级表示:基础知识_操作系统_20

移动数据:

【CSAPP】程序的机器级表示:基础知识_寄存器_21

操作数类型: 

即时数据:恒定的整数数据

例如:$0x400, $-533

像C语言的常数,但是前缀是'$'

用1,2,或4个字节编码

寄存器:16个整数寄存器之一 

例如:%rax,%r13

但是 %rsp 被保留为特殊用途

其他有特殊用途的指令

内存:在寄存器给定的地址上连续8个字节的内存

举个最简单的例子:(%rax)

其他各种 "地址模式"

0x12  movq 操作数组合(movq Operand Combinations)

【CSAPP】程序的机器级表示:基础知识_Assembly_22

(无法用单条指令进行内存转移)

0x13  简单内存寻址模式(Simple Memory Addressing Modes)

【CSAPP】程序的机器级表示:基础知识_操作系统_23

💬 简单寻址模式的例子:

【CSAPP】程序的机器级表示:基础知识_Code_24

0x14  理解 Swap ( )

【CSAPP】程序的机器级表示:基础知识_寄存器_25

 

【CSAPP】程序的机器级表示:基础知识_Assembly_26

 

【CSAPP】程序的机器级表示:基础知识_Code_27

 

【CSAPP】程序的机器级表示:基础知识_Assembly_28

 

【CSAPP】程序的机器级表示:基础知识_CSAPP_29

0x15  完整的内存寻址模式(Complete Memory Addressing Modes)

【CSAPP】程序的机器级表示:基础知识_操作系统_30

💬 地址计算的例子

【CSAPP】程序的机器级表示:基础知识_CSAPP_31

0x16  地址计算指令(Address Computation Instruction)

【CSAPP】程序的机器级表示:基础知识_Assembly_32


【CSAPP】程序的机器级表示:基础知识_Code_33

 是地址模式表达式② 将

【CSAPP】程序的机器级表示:基础知识_操作系统_34

 设置为表达式所表示的地址

用途:

计算没有内存引用的地址(例如,p = &x[i] 的翻译)

计算形式为 

【CSAPP】程序的机器级表示:基础知识_CSAPP_35

  的算术表达式 

【CSAPP】程序的机器级表示:基础知识_操作系统_36

 或 

【CSAPP】程序的机器级表示:基础知识_CSAPP_37

例子:

【CSAPP】程序的机器级表示:基础知识_寄存器_38

0x17  一些算术运算(Some Arithmetic Operations)

【CSAPP】程序的机器级表示:基础知识_Code_39

注意参数的顺序!

有符号 int 和无符号 int 之间没有区别(Why?)

单操作数指令:

【CSAPP】程序的机器级表示:基础知识_操作系统_40

💬 算术表达式例子:

long arith
(long x, long y, long z)
{
long t1 = x+y;
long t2 = z+t1;
long t3 = x+4;
long t4 = y * 48;
long t5 = t3 + t4;
long rval = t2 * t5;

return rval;
}

【CSAPP】程序的机器级表示:基础知识_Code_41

 

【CSAPP】程序的机器级表示:基础知识_操作系统_42

:地址计算

【CSAPP】程序的机器级表示:基础知识_操作系统_43

:移位

【CSAPP】程序的机器级表示:基础知识_寄存器_44

:乘法(但是只使用1次)

📚 理解:

【CSAPP】程序的机器级表示:基础知识_Code_45

0x18  汇编特征:数据类型(Assembly Characteristics: Data Types)

1、2、4或8字节的 "整数"  ① 数据  ② 数据值地址(无类型的指针)

4、8或10字节的浮点数据

代码:编码一系列指令的字节序列

没有集合类型   如数组或结构体,只是在内存中连续分配字节而已。

0x19  Assembly Characteristics: Operations

在寄存器或内存数据上执行算术函数

在内存和寄存器之间传输数据   ① 从内存加载数据到寄存器    ② 将寄存器数据存储到内存

传输控制 ① 无条件跳转到程序   ② 条件分支

0x1A  Object Code

汇编器 

① 将 .s 翻译成 .o 

② 每条指令的二进制编码

③  可执行代码的近乎完整的图像

④  不同文件中的代码之间缺少联系

链接器

解决文件之间的引用

与静态运行时库结合  (例如:malloc、printf)

一些库是动态链接的(程序开始执行时进行链接)

Computer Systems: A Programmer's Perspective (3rd Edition)

举报

相关推荐

0 条评论