PART1: 计算机系统漫游
- 组成设备
PART3: 程序的机器级表示
- 一个可执行程序
- 编译过程
- 预处理
- 编译
- 汇编
- 连接
- 编译细节
gcc -O[g|1|2] <file>
优化等级- 编译器优化可能会调整代码次序,源代码会严重变形,导致并发时不满足顺序一致性内存模型
- 编译过程
- 数据格式
- 字节,字,双字,四字
- 数据类型的汇编代码表示
- b, w, l, q
- 操作数指示符
- 操作数可以是立即数值、寄存器值和来自内存的值
- 立即数的形式
$Imm
- 寄存器的形式
%r
- 内存寻址的形式
Imm(rb, ri, si)
- 表示
M[Imm + R[rb] + R[ri]*si
,参数是可以省略的,如(,%rcx,)
M[]
表示取内存值,R[]
表示取寄存器值
- 表示
- 数据传送指令
mov[数据大小]
- 几类寄存器的格式
r[a|b|c|d]x
、eax
、ax
、al
r[s|d]i
、esi
、si
、sil
r[b|s]p
、esp
、sp
、spl
r[8-9]
、r8d
、r8w
、r8b
- 简记:有r说明4字、e说明双字、l说明字节,剩下的就说明是单字
- lea(load effective address)取有效地址
leaq 7(%rdi, %rsi, 4), %rax
,则%rad=7+R[%rdi]+R[%rsi]*4
- 处理用在取地址,还可以用在简单的加法和乘法
栈
1 | 低地址: |
pushq S
(4字)R[%rsp] <- R[%rsp]-8
,栈顶指针减8- 相当于
subq $8, %rsp
- 相当于
M[R[%rsp]] <- S
,入栈- 相当于
movq %rbp, (%rsp)
- 相当于
- 区别在于
pushq
指令编码为1字节
- 弹出同理
- 出栈
- 指针加
- 知道了栈内存的分布,则可用内存寻址访问栈
movq 8(%rsp), %rdx
,把栈第二个元素存到rdx寄存器中
运算符
- 算数运算符
- 常见的算数运算符有加减乘除,与或非异或,算数(
sa[l|r]
)逻辑(sh[l|r]
)左右移等- 这些运算符都会改变条件码,以实现条件控制
- 特殊的算数操作
- 常见的算数运算符有加减乘除,与或非异或,算数(
- 条件码
- 常用条件码有:
- CF:进位标志
- ZF:零标志
- SF:符号标志
- 不改变条件码的操作
cmp[b|w|l|q]
,与sub相同,只是不改变条件码test[b|w|l|q]
,与and相同,只是不改变条件码
- 访问条件码
- 根据条件码设置寄存器01,称为set操作,后缀指明 考虑的条件码组合 ,如
setl R
(set less)将D设为SF^OF
- 根据条件码设置寄存器01,称为set操作,后缀指明 考虑的条件码组合 ,如
- 常用条件码有: