CSAPP笔记
处理器体系结构
指令集架构
x86 | ARM |
---|---|
Intel AMD | 手机,平板 |
CISC(复杂指令集) | RISC(精简指令集) |
Y86架构
详细见书介绍
简介
组成
8个寄存器(%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp),三个标志位(ZF,OF,SF),一个程序计数器(PC),一个内存
指令集结构
0~5个字节,每个字节由2个十六进制数字表达
位置 | 作用 |
---|---|
0(第一位代码部分,第2位功能部分) | 指令类型 |
1 | 操作的寄存器 |
2~5 | 偏移量,值 |
大体指令 | 数字 |
---|---|
nop |
0 |
halt |
1 |
mov |
2,3,4,5 |
OPl |
6 |
jxx |
7 |
call |
8 |
ret |
9 |
push |
A |
pop |
B |
Tips:
- 内存之间的传送必须要靠寄存器;
- 内存不能存储立即数
- OPl 指add,sub,and,xor
- halt 停止指令的执行(x86是hlt)
逻辑设计和硬件控制语言HCL
逻辑门
组合电路(计算块)
解释: 多个逻辑门的组合如xor
多路复用器电路(根据控制信号来选出使用的电路)用情况表达式来描述
1 | int Out =[ |
ALU(算数/逻辑单元)就是一种组合电路
存储器和时钟控制
硬件寄存器 | 存储单个字或位 |
---|---|
程序寄存器 | 寄存器文件,%eax… |
此处作者没咋理解…
Y86的顺序实现
流水线(SEQ)
一条指令包括6个操作:
- 取指: 读入指令(第0个字节),计算下一条指令的地址
- 解码: 读入指定的寄存器
- 执行: 执行指令
- 访存: 访问内存
- 写回: 写回寄存器
- 更新PC: 将下一条指令地址更新
SEQ的时序
看不懂QAQ
优化程序性能
浮点数乘法损耗性能较大
优化编译器
通过 -O 来优化会有一定的局限性, 会出现"存储器别名使用"—编译器必须假设指针指向的位置不同, “认为函数有副作用”
表示程序性能
CPE(cycle per element)
循环优化
- 代码移动: 将计算结果不会改变的放在循环体外的局部变量
- 函数调用: 循环体里尽量不要函数调用(会损坏一定的封装性)
- 指针引用: 循环体中减少指针的解引用,可以在循环体外用局部变量储存值
理解现代处理器
超标量乱序执行计数:
- 汇编代码上: 好像是一次执行一个指令
- 实际上: 是同时对多条指令进行流水线操作的
遇到了分支有三种处理方式: 1.选择分支 2.分支预测 3.两个都要
了解算术操作的执行时间和发射时间, 发现除法(38)和浮点数乘法的性能损耗(5)大
循环展开
单指令多操作寄存器
%xmm | 128位 |
---|---|
%ymm | 256位 |
%zmm | 512位 |
存储器层次结构
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 travel!
评论