CMU-CSAPP #1

Merged
Void_Deer merged 7 commits from CMU-CSAPP into main 2026-04-20 16:54:18 +08:00
2 changed files with 5 additions and 7 deletions
Showing only changes of commit 0f999de708 - Show all commits

View File

@@ -105,7 +105,7 @@
- 寄存器不够存放所有的局部变量 - 寄存器不够存放所有的局部变量
- 某些局部变量是个Array或者Struct - 某些局部变量是个Array或者Struct
- 对一个局部变量取地址(&)需要它在内存中有一个固定地址 - 对一个局部变量取地址(&)。这个操作需要它在内存中有一个固定地址才能进行,因此会给它分配一个栈空间。
加上其他要分配的内存[^extra-mmr-allocate],这部分被称作“栈帧”。 加上其他要分配的内存[^extra-mmr-allocate],这部分被称作“栈帧”。
@@ -161,17 +161,15 @@ A: 在编译时,编译器会根据函数预计内存的使用情况来生成
| ```%rax``` | Caller-Save | 返回值 | | ```%rax``` | Caller-Save | 返回值 |
| ```%rdi``` | Caller-Save | 传递参数 | | ```%rdi``` | Caller-Save | 传递参数 |
| ```%rsi``` | Caller-Save | 传递参数 | | ```%rsi``` | Caller-Save | 传递参数 |
| ```%rdx``` | Caller-Save | 传递参数 |
| ```%rcx``` | Caller-Save | 传递参数 | | ```%rcx``` | Caller-Save | 传递参数 |
| ```%rdx``` | Caller-Save | 传递参数 |
| ```%r8``` | Caller-Save | 传递参数 | | ```%r8``` | Caller-Save | 传递参数 |
| ```%r9``` | Caller-Save | 传递参数 | | ```%r9``` | Caller-Save | 传递参数 |
| ```%r10``` | Caller-Save | 临时寄存器 | | ```%r10``` | Caller-Save | 临时寄存器 |
| ```%r11``` | Caller-Save | 临时寄存器 | | ```%r11``` | Caller-Save | 临时寄存器 |
| | | | | | | |
| **```%rbx```** | Callee-Save | 被调用者保存寄存器 | | **```%rbx```** | Callee-Save | 被调用者保存寄存器 |
| ```%r12``` | Callee-Save | 被调用者保存寄存器 | | ```%r12``` to ```%r15``` | Callee-Save | 被调用者保存寄存器 |
| ```%r13``` | Callee-Save | 被调用者保存寄存器 |
| ```%r14``` | Callee-Save | 被调用者保存寄存器 |
| ```%rbp``` | Callee-Save[^rbp-linux-reg-saving] | 特殊[^rbp-linux-reg-saving] | | ```%rbp``` | Callee-Save[^rbp-linux-reg-saving] | 特殊[^rbp-linux-reg-saving] |
| ```%rsp``` | Callee-Save[^rsp-linux-reg-saving] | 特殊[^rsp-linux-reg-saving] | | ```%rsp``` | Callee-Save[^rsp-linux-reg-saving] | 特殊[^rsp-linux-reg-saving] |

View File

@@ -188,7 +188,7 @@ get_short_int:
出于硬件原因[^Memory-Alignment-Hardware-Reason],结构体中的成员在内存中的位置需要按照特定的边界进行对齐。这意味着编译器可能会在成员之间插入填充字节,以确保每个成员都位于正确的内存地址上。 出于硬件原因[^Memory-Alignment-Hardware-Reason],结构体中的成员在内存中的位置需要按照特定的边界进行对齐。这意味着编译器可能会在成员之间插入填充字节,以确保每个成员都位于正确的内存地址上。
[^Memory-Alignment-Hardware-Reason]: 内存对齐是为了提高访问效率。现在的机器一次从内存中读取大约64字节。如果数据没有对齐,可能需操作系统或者硬件的额外处理,导致效率降低 [^Memory-Alignment-Hardware-Reason]: 无论数据是否对齐x86-64硬件都基本可以正常工作。但Intel依旧建议对其数据以获得更好的性能。如果数据对齐,CPU可能需要两次内存访问来获取数据导致性能下降
- 编译器会找到最大的成员的大小,并将结构体的总大小调整为该大小的倍数。内存对齐也会按照该大小进行。 - 编译器会找到最大的成员的大小,并将结构体的总大小调整为该大小的倍数。内存对齐也会按照该大小进行。