csapp
chapter 2
ps:再加上操作系统就可以抽象为虚拟机。
-
小数转二进制
-
一个数是无符号数另一个数也要转化为无符号数。
-
有符号数=补码
-
-
\(x_{w}^{t}\) 是有符号加法是否溢出,有符号数逆元若 \(x=TMin_w,-x_w^t=TMin_w\)
-
\(-x_{w}^{u}\) 是无符号数逆元,同时也可表示加法是否溢出
-
-
大端:从低底知道高地址。X86-64系统是小端储存。
-
\(==\) 比较的是二进制位,有符号数和无符号数加法和乘法都是相同的。
-
IEEE 754标准
- Sign bit:一位1表示negative,0表示positive。
- Exponent(阶码),规范化是从0000 0001~1111 1110
- Significand
eg:
-
向偶数舍入
- 浮点数操作,同样的xxx100就相当于使0.5的情况,向上一位偶数舍入。
- 循环小数也像这种规律舍入即可。
-
只要有浮点数,就要按照浮点数的运算法则。
-
浮点数加法结合律通常会不太true,而且浮点数上溢出只会到无穷。
chapter 3
-
程序员可以获取的状态
- Program counter:下一条指令的地址,存储在寄存器rip中。
- Register file:大量使用的程序数据。
- Condition codes:储存最近的算术或逻辑运算的状态信息,用于条件分支中。
- Memory:存储可按字节寻址的数组,程序和数据以及栈(堆)
- ps:cache不可见
-
objdump -d 反汇编
-
函数传参的顺序:rdi rsi rdx rcx,rsp栈指针rax返回值
-
b一个字节w两个字节l四个字节q八个字节。
-
内存中的值不可以直接读入到内存中。
-
CMOVE 条件传送
- 无符号数
- CMOVEA/CMOVNBE
- CMOVAE/CMOVNB
- CMOVNC 不仅为 CMOVC 进位
- 有符号数
- lgeno:小于大于相同否溢出。
- CMOVS/CMOVNS 带符号/不带符号
- 无符号数
-
数据传送:替换后4个字节,高位字节自动补0,这就是为啥没有movzlq。特殊的符号扩展ctlq将eax扩展到rax。
-
递归
-
缓冲区溢出攻击防御方法:
- 避免溢出漏洞。
- use 系统级的protection.
- 随机的栈偏移。
- 非可执行代码段。
- 编译器use“栈金丝雀”。
-
移位量是由%cl的低logw(w为移位数据值的位长度)决定。
-
test cmp cf zf sf of
chapter 5
-
在同一个地址 -
一般有用的优化:
- 代码移动
- 复杂运算简化,use移位运算。
-
循环展开最多展开到延迟*容量。
-
左边作为关键路径的原因:右边的mul可以提前准备好(假设是足够长的循环)。
chapter 6
-
-
顺序快,随机慢。
-
-
需要记忆
chapter 7
5.
-
开头地址不为0,说明是可执行file。
-
相对地址:PC32,即使是负数 绝对地址:32 直接把地址写出来
chapter 8
-
-
内核代码区可以不保存。
PID 返回当前进程的PID
PPID 返回父进程的PID
必须要触发exit,wait才可以过去,waitpid wait特定的指定进程。
fork:一次调用两次返回
exit:一次调用零次返回
chapter 9
-
当存进内存的是物理页号,再次盘里的就是磁盘地址。
-
-
外部和内部碎片的区别
-
-