【WIP】CMU 15-213 笔记 Part.1
Lecture 1
实验
Lab1:数据实验,用位运算方式实现计算器
Lab2:炸弹实验,学会GDB
Lab3:攻击实验,代码注入和ROP
Lab4:缓存实验,写个缓存模拟器并优化
Lab5:Shell实验,写一个完整的Linux Shell
Lab6:Malloc实验,写自己的Malloc库
Lab7:代理实验,写自己的Web Proxy
Lecture 2
比特、字节和整数
long double数据类型:在传统的32位架构或64位架构中是没有的。但在x86-64架构中占10或16字节(内存对齐)。
32位架构的指针为32位(4字节),64位架构的指针为64位(8字节)。
布尔代数:和 或 非 异或
位运算符 & | ~ ^,逻辑运算符 && || !
逻辑运算的短路特性
逻辑位移和算数位移:
- 在位移运算符之前的数(比如$x<<y$中的$x$)是无符号数的话,位移运算对应的汇编指令为逻辑位移。若是有符号数,该运算对应的汇编指令是算数位移。
- 对于左移:二者都是在右侧补0。
- 对于右移:逻辑位移补0,算数位移补最高有效位(符号位)。如:令$x=10100000_{(2)}$,右移3位,逻辑位移结果$x>>3=00010100_{(2)}$,算数位移结果$x>>3=11110100_{(2)}$。
位移数小于0(即$x<<y$中的$y$小于0)或大于数据类型占用的长度(如char类型中y大于8)是未定义的操作。结果和编译情况依编译器和架构变化。
正数原码转十进制:求2的幂次加和即可。
$$ B2U(X) = \sum^{w-1}_{i=0}{x_i \cdot 2^i} $$
- 补码转十进制:注意符号位。也可写成公式。
$$ B2T(X) = -x_{w-1} \cdot 2^{w-1} + \sum^{w-2}_{i=0}{x_i \cdot 2^i} $$
- 补码计算举例:将补码$101101_{(2)}$化为十进制。
$$ 依据公式,\\ 101101_{2} = 2^{0} \cdot 1 + 2^{1} \cdot 0 + 2^{2} \cdot 1 + 2^{3} \cdot 1 + 2^{4} \cdot 0 + 2^{5} \cdot (-1) \\ = 1 + 0 + 4 + 8 + 0 - 32 = -19 $$
- 无符号数最大值$2^w - 1$,最小值$0$。有符号数最大值$2^{w-1} - 1$,最小值$-2^{w-1}$。