计算机组成原理
大二上学期计算机组成原理的复习笔记,目前已完结。
一、数据
1. 基本概念
- 字长:指针数据的标称大小,32 位系统为 4 字节
- 对象的地址为低地址(最小地址),最低有效字节在低地址(67 45 23 01)
- 逻辑运算符 && 和 || 有短路性,位运算符没有
- 加减法的优先级高于移位运算
- 整数运算有交换结合分配律没有单调性;浮点运算有单调性、只有交换律
2. 整数
- 逻辑右移补零,算术右移补符号位
- %d,%u,%x 分别输出有符号十进制、无符号十进制、十六进制
- 有符号和无符号运算时,有符号被转为无符号
- short 转 unsigned:先扩展(补符号位),再转为无符号
- 加法溢出:无符号 $s<x$;有符号 $x,y$ 同号且结果异号
- TMin 的逆元为 TMin,其余为相反数
- 有无符号右移为向下取整,但有符号除法要向零:
x<0 ? x+(1<<k)-1 : x) >> k - ~x+1 等价于 -x
3. 浮点数
- 32 位:1+8+23,64 位:1+11+52
- $V=(-1)^s\times M\times 2^E,E=e-Bias=e-2^{k-1}-1$
- 规格化数 $M=1+f$;非规格化数 $M=f,e=1$
- 向偶数舍入,最低有效位为 0 为偶数(只对 X.Y100 有效)
- $NaN+x=NaN$
二、汇编
1. 基本概念
- movq 不支持内存到内存
- leaq 仅做地址计算,不访问内存,不设置条件码
- sarq 算术右移,shrq 逻辑右移
- ZF:零;SF:负;CF/OF:无符号/有符号溢出
- cmp,test 设置条件码,不保存结果
- ja/jb 无符号大于/小于;jl=(SF^OF)
- setX 只支持低地址单字节,配合 movzbl(32 位)
- 条件移动 cmovX:不用于复杂计算、风险引用和副作用计算
2. 过程调用
- 栈:向低地址生长,%rsp 指向当前栈顶
- call 将下一条指令地址入栈,属于调用者栈帧
- 参数顺序:%rdi,%rsi,%rdx,%rcx,%r8,%r9,Arg7 在低地址
- 调用者保存:%rax,%r10,%r11 和六个参数
- 存储空间:text 代码,data 全局变量,heap 动态分配,stack 局部变量
- 栈攻击防护:检查输入长度、安全函数、栈随机化、栈不可执行、金丝雀
三、处理器
1. Y86-64 指令集
- 无 %r15,无 CF(只有 opq 设置),小端法
- 寄存器:%rax,%rcx,%rdx,%rbx,%rsp,%rbp,%rsi,%rdi
- icode:halt,nop,cmov,irmovq,rmmovq,mrmovq,opq,jxx,call,ret,pushq,popq
- irmovq 寄存器 F,rB;mrmovq D(rB),rA
- ifun:le,l,e,ne,ge,g;add,sub,and,xor
- 状态:AOK,HLT,ADR,INS=1,2,3,4
- 程序结构:从零地址开始,需初始化栈指针和数据
1 | |
2. 顺序处理器
- HCL:小写 bool 大写 words,&&/||/!;in {}
- 阶段:Fetch,Decode,Execute,Memory,WriteBack,PC
- Fetch:icode,ifun;rA,rB;valC;valP
- Decode:valA,srcA;valB,srcB
- Execute:valB/0 OP/ALUADD valA/valC/8;0xF
- Memory:valM
- WriteBack:valE,dstE;valM,dstM
- PC:Cnd? (Cnd $\leftarrow$ Cond(CC,ifun))
- 控制流
int icode=[imem_error:INOP;1:mem_icode;];int ifun=[imem_error:FNONE;1:mem_ifun;];int Stat=[imem_error||dmem_error:SADR;!instr_valid:SINS;icode==IHALT:SHLT;1:SAOK;];need_regids;mem_addr;mem_read;new_pc
四、存储
1. 缓存
- Miss:cold(compulsory),capacity,conflict
- S=2^s sets, E=2^e lines/set, B=2^b bytes/block
- Address:m=t+s+b,(S,E,B,m)
- Write-through/back;Write-allocate/no-write-allocate
- 存储器山:时间局部性脊,空间局部性斜坡,硬件预取脊
2. 程序优化
- 矩阵乘法:
A[i][k]*B[k][*]=C[i][*];分块 $3B^2<C$ - 通用方法:代码移动(减少函数调用)、临时变量
- 循环展开:减少数据依赖,展开、重组、并行
计算机组成原理
https://sqzr2319.github.io/25Fall/CSAPP/