计算机系统2
3. 程序的机器级表示
汇编指令 3.1——3.6
.开头:指导汇编器,连接器工作的伪指令
调用者/被调用者保存
操作码:bwlq 1248
操作数
\(Imm(r_b, r_i, s) = Imm + R[r_b] + R[r_i]\cdot s\)
\(s = 1, 2, 4, 8 \,\,与数组类型相关\)
注意区分 \(Imm:\)$ 和 \((r_a):()\)
立即数
$ + 常数(最多4字节)
寄存器
\(R[r_a]\):寄存器的值
常用寄存器(背):%rax %rsp %rdi %rsi %rdx %rcx %r8 %r9
内存引用
\(M[Addr]\):地址的值
MOV类
MOV S D
\(S\):立即数,寄存器,内存引用
\(D\):寄存器,内存引用
许多细节:
-
S
和D
不能同时是内存引用 -
S
和D
数位相同:
movq S D:
S
为立即数时只能是32位,然后符号扩展
S
为64位时用:movabsq $Imm Register
,D 只能是寄存器
movl
的D
为寄存器时,其高四字节被置0
——任何位寄存器生成32位值的指令都会把该寄存器的高位部分置为0
S
数位小于D
:
MOVZ类
:零扩展
movzbw, movzbl, movzwl, movzbq, movzwq
没有movzlq
:可以通过 movl
实现
MOVS类
:符号位扩展
movsbw, movsbl, movswl, movsbq, movswq, movslq, cltq
cltq
无操作数, 等价于 movslq $eax %rax
栈
高地址 -> 低地址
pushq Register
popq Register
leaq
leaq S D
地址都是64位,所以只有q
加载有效地址,仅做地址搬运,不读取数据!!!
算术逻辑
一元:INC DEC NEG NOT
二元:ADD SUB IMUL XOR OR AND
D
不能是立即数
移位:SAL SHL SAR SHR + k D
, k 为%cl或立即数
关于 %cl:长度为8,bwlq 对应移位量为 %cl 的低 3456 位
条件码寄存器 SET
ALU:执行算术逻辑运算 + 设置条件码寄存器
1bit
CF进位,ZF零,SF符号,OF溢出
cmp test
设置条件码寄存器,不更新目的寄存器的值
记住含义:
有符号:setg setge setl setle
SF,OF
无符号:seta setae setb setbe
CF,ZF
跳转
条件跳转:cmovg cmovge cmovl cmovle
for, while do while
switch 跳转表,高效
3.7 过程(函数调用)
函数调用与返回
- 把调用语句的下一条语句地址压入栈
- 执行完被调用函数后从栈中弹出该地址返回函数继续执行
参数传递:
1-6个参数用固定寄存器
其余用栈传递:
栈存储:所有数据大小为8的倍数
栈顶返回地址
局部变量也在栈中,但是不需要对齐;传递参数必须对齐 关于对齐规则 add
每个参数实际大小由自身变量类型决定,具体位置根据大端/小端存储法来定。
调用者/被调用者保存寄存器
递归调用:栈溢出
3.8 数组的分配和访问
根据数据类型来定,行优先
3.9 结构体联合体
结构体对齐
地址对齐:任何 \(k\) 字节的基本对象的地址必须是 \(k\) 的倍数
末端也会对齐(为了下一次的起始地址合理,结构体占的总字节数为4的倍数)
指针都是8字节!!!!
联合体 \(Union\) 大小:最大字段的大小
用处:访问不同数据类型的位模式(一种类型存储,另一种类型访问)
3.10 缓冲区溢出
越界,限定范围
栈随机化
栈的位置每次运行都变
地址空间布局随机化 \(ASLR\)
栈破坏检查
缓冲区与栈之间加入 金丝雀 (随机产生,只读)
金丝雀值修改 -> 遭受了攻击
限制可执行代码区域
消除攻击者向系统中插入可执行代码的能力
分离可读 与 可执行
6. 存储器层次结构
6.1 存储技术
6.2 局部性
6.3 存储器层次结构
6.4 高速缓存存储器
cache是主存的副本
主存打包放进cache
映射规则:主存怎么放到cache里
主存物理地址 = 块号 + 块内地址
标记:一个块的唯一标识
全相联映射:主存物理地址 = 标记 + 块内地址
组相联地址:主存物理地址 = 标记 + 组号 + 块内地址
直接映射:主存物理地址 = 标记 + cache行号 + 块内地址
(理解:相联 = 随便,直接映射 = 一路随便)
cache内部结构
中间位作为组索引:因为要保证每块内存都要被使用到 提高cache的使用率
辅助理解:
判断cache命中:组选择 - 行匹配 - 字抽取
冲突不命中,cache抖动
数据填充消除抖动
行替换:随机替换,LFU,LRU
cache的写操作:命中/不命中