Update: 更新 L07 和 L08 文档,修正描述
This commit is contained in:
@@ -105,7 +105,7 @@
|
||||
|
||||
- 寄存器不够存放所有的局部变量
|
||||
- 某些局部变量是个Array或者Struct
|
||||
- 对一个局部变量取地址(&),需要它在内存中有一个固定的地址
|
||||
- 对一个局部变量取地址(&)。这个操作需要它在内存中有一个固定地址才能进行,因此会给它分配一个栈空间。
|
||||
|
||||
加上其他要分配的内存[^extra-mmr-allocate],这部分被称作“栈帧”。
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
[^extra-mmr-allocate]: 上一个函数的寄存器内容、Windows下的影子空间、返回地址等等内容。
|
||||
|
||||
需要注意的是,在C语言中,struct、union这种“庞大”的数据类型也会被留在栈上。如果处理不当,很可能Stack Overflow。因此,在处理大型数据结构时,通常建议使用动态内存分配(如malloc)来避免栈空间的过度使用,并使用free来手动释放。
|
||||
需要注意的是,在C语言中,struct、union这种“庞大”的数据类型也会被留在栈上。如果处理不当,很可能Stack Overflow。因此,在处理大型数据结构时,通常建议使用动态内存分配(如malloc)来避免栈空间的过度使用,并使用free来手动释放。
|
||||
|
||||
### Recursion 递归
|
||||
|
||||
@@ -161,17 +161,15 @@ A: 在编译时,编译器会根据函数预计内存的使用情况来生成
|
||||
| ```%rax``` | Caller-Save | 返回值 |
|
||||
| ```%rdi``` | Caller-Save | 传递参数 |
|
||||
| ```%rsi``` | Caller-Save | 传递参数 |
|
||||
| ```%rdx``` | Caller-Save | 传递参数 |
|
||||
| ```%rcx``` | Caller-Save | 传递参数 |
|
||||
| ```%rdx``` | Caller-Save | 传递参数 |
|
||||
| ```%r8``` | Caller-Save | 传递参数 |
|
||||
| ```%r9``` | Caller-Save | 传递参数 |
|
||||
| ```%r10``` | Caller-Save | 临时寄存器 |
|
||||
| ```%r11``` | Caller-Save | 临时寄存器 |
|
||||
| | | |
|
||||
| **```%rbx```** | Callee-Save | 被调用者保存寄存器 |
|
||||
| ```%r12``` | Callee-Save | 被调用者保存寄存器 |
|
||||
| ```%r13``` | Callee-Save | 被调用者保存寄存器 |
|
||||
| ```%r14``` | Callee-Save | 被调用者保存寄存器 |
|
||||
| ```%r12``` to ```%r15``` | Callee-Save | 被调用者保存寄存器 |
|
||||
| ```%rbp``` | Callee-Save[^rbp-linux-reg-saving] | 特殊[^rbp-linux-reg-saving] |
|
||||
| ```%rsp``` | Callee-Save[^rsp-linux-reg-saving] | 特殊[^rsp-linux-reg-saving] |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user