0x00 英特尔x86处理器(Intel x86 Processors)
主导市场:
笔记本电脑、台式机、服务器。
进化的设计:
向后兼容,直到1978年推出的8086 - 随着时间的推移,增加了更多的功能。
复杂指令集计算机(CISC)
支持许多不同格式的指令。
精简指令集计算机(RISC)的性能难以匹敌!
但是英特尔已经做到了! - 在速度方面。
0x01 因特尔x86的演变:里程碑(Intel x86 Evolution: Milestones)
0x02 程序就像是食谱(Programs are like recipes)
0x03 冯诺依曼建筑(Von Neumann Architecture)
现代计算机的一个常见模型
指令以二进制表示,就像数据一样
指令和数据存储在存储器中
0x04 汇编/机器码视图:Assembly/Machine Code View
PC: 程序计数器:① 下一条指令的地址 ② 被称为 "RIP" (x86-64)
寄存器文件: 大量使用的程序数据
条件代码:① 存储最近的算术或逻辑操作的状态信息 ② 用于条件性分支
内存: ①字节寻址阵列 ② 代码和用户数据 ③ 支持程序的堆栈
0x05 编译系统(Compilation System)
将高级C程序翻译成二进制代码,由处理器读取和执行。
0x06 将C语言转换为目标代码(Turning C into Object Code)
0x07 汇编和二进制编码(Assembly and Binary code)
汇编: ① 二进制代码的文本(符号)表示 ② 计算机硬件无法理解 ③ 一系列指令
操作代码: ① 二进制格式的指令序列,可由机器读取。 ② 它将被解析到集成电路上
指令:工作的基本单位
指令指定: ① 要在CPU上执行的操作或操作码 ② 源操作数和结果的目的地
0x08 架构 - ISA指令集架构(Architecture - ISA: instruction set architecture)
软件和硬件之间的契约 / 接口
① 操作和存储位置(寄存器)的功能定义。
② 精确描述了软件如何调用和访问硬件的操作和存储。
ISA规定了汇编的语法和语义
ISA是一个新的抽象层。
① ISA规定了硬件提供的东西,而不是它的实现方式。
② 隐藏了CPU实现的复杂性。
③ 不需要改变软件(我们可以在8086(1978)和奔腾4(2003)中运行软件,因为它们是x86 ISA的实现)
0x09 定义(Definitions)
架构: (ISA:指令集结构)一个处理器设计中需要理解或编写汇编/机器代码的部分。例如:指令集规范、寄存器。 - 微架构。架构的实现。例如:高速缓存大小和核心频率。
代码形式:① 机器代码:处理器执行的字节级程序 ② 汇编代码:机器代码的文本表示
ISA实例: ① 英特尔:x86、IA32、Itanium、x86-64 - ARM ② 几乎所有的手机上都有在使用
0x0A 编译器命令(Compiler command)
(assembly - 汇编 assembler - 汇编器 Linker - 链接器)
0x0B 使用GDB(Use GDB)
0x0C 机器指令示例(Machine Instruction Example)
0x0D 反汇编目标代码(Disassembling Object Code)
0x0E 穿插拆解(Alternate Disassembly)
❓ 那些东西可以被拆解?
① 任何可以被解释为可执行代码的东西
② 反汇编程序检查字节并重建汇编的源代码
0x0F x86-64 整数寄存器(x86-64 Integer Registers)
可以引用低位字节序(大小端)(low-order) 4 字节。(也可以引用 low-order 1&2 字节)。
0x10 一些历史:IA32寄存器(Some History: IA32 Registers)
0x11 移动数据(Moving Date)
移动数据:
操作数类型:
即时数据:恒定的整数数据
例如:$0x400, $-533
像C语言的常数,但是前缀是'$'
用1,2,或4个字节编码
寄存器:16个整数寄存器之一
例如:%rax,%r13
但是 %rsp 被保留为特殊用途
其他有特殊用途的指令
内存:在寄存器给定的地址上连续8个字节的内存
举个最简单的例子:(%rax)
其他各种 "地址模式"
0x12 movq 操作数组合(movq Operand Combinations)
(无法用单条指令进行内存转移)
0x13 简单内存寻址模式(Simple Memory Addressing Modes)
💬 简单寻址模式的例子:
0x14 理解 Swap ( )
0x15 完整的内存寻址模式(Complete Memory Addressing Modes)
💬 地址计算的例子
0x16 地址计算指令(Address Computation Instruction)
① 是地址模式表达式
② 将 设置为表达式所表示的地址
用途:
计算没有内存引用的地址(例如,p = &x[i] 的翻译)
计算形式为 的算术表达式 或
例子:
0x17 一些算术运算(Some Arithmetic Operations)
注意参数的顺序!
有符号 int 和无符号 int 之间没有区别(Why?)
单操作数指令:
💬 算术表达式例子:
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; }
:地址计算
:移位
:乘法(但是只使用1次)
📚 理解:
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)