计算机系统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\):寄存器,内存引用

许多细节:

  1. SD不能同时是内存引用

  2. SD 数位相同:

movq S D: S为立即数时只能是32位,然后符号扩展
S为64位时用:movabsq $Imm RegisterD 只能是寄存器

movlD为寄存器时,其高四字节被置0——任何位寄存器生成32位值的指令都会把该寄存器的高位部分置为0

  1. 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. 把调用语句的下一条语句地址压入栈
  2. 执行完被调用函数后从栈中弹出该地址返回函数继续执行

参数传递:
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的写操作:命中/不命中

posted @ 2023-06-21 12:09  Sakana~  阅读(49)  评论(1编辑  收藏  举报