【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}$。
  • 补码对数的映射具有“对称性”。

image-20210411163333866

  • 补码与原码(无符号位)间的转化。

image-20210411163354037

  • C 语言上二者的互相转化。
1
2
tx = (int) ux;
uy = (unsigned) ty; // unsigned 等价于 unsigned int
  • 有符号数与无符号数进行操作时(例如,有符号数与无符号数相加),有符号数会被隐式转换为无符号数。

  • 注意在有条件限定的情况下,下列运算的运算结果:

image-20210411163406261

  • 一个 C 编程中的典型错误:
1
2
3
4
5
6
7
8
9
10
11
int a[250] = {0};
unsigned int i; // 注意是无符号整型

for(i = 249; i >= 0; i--) {
a[i] = 5;
}

/*
运行的结果为:遍历数组 a,每个元素均赋值为 5 后,访问非法下标。
由于 i 是无符号的数,i=0 时 for 循环进行后,i--,导致 i 溢出为 4294967295。
*/
  • 符号扩展:对有符号整数的类型转换是通过左侧截断和左侧补最高有效位(符号位)实现的。

    例子:设 6 位整数 a 的十进制值为 10,则其二进制位为 $001010$。将其扩展为 10 位整数,二进制位为 $0000001010$。

    设 6 位整数的十进制值为 -10,则其二进制位(补码)为 $110110$。将其扩展为 10 位整数,二进制位为 $1111110110$。

  • 原码取 2 的幂次模:相当于从右边截断。

    例子:数字 10 对 4 取模。通过十进制计算,$10=4*2+2$,得取模结果为 2。

    从原码的角度来看,10 的原码为 $1010_{(2)}$。对 4 取模,即对 $2^2$ 取模。从右向左保留两位后截断即可,结果即为 $10_{(2)}$,转化为 10 进制为 2。

Lecture 3

作者

Zhou Weitong

发布于

2021-03-20

更新于

2021-08-15

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×