Compare commits

...

8 Commits

5 changed files with 1900 additions and 7 deletions

View File

@@ -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] |

View File

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

View File

@@ -0,0 +1,52 @@
# 目录
- [CPU寄存器](#cpu寄存器)
- [x86-64 Linux System V ABI的寄存器用途](#x86-64-linux-system-v-abi)
- [Flags 标志位](#flags-标志位)
## CPU寄存器
### x86-64 **Linux** System V ABI
| 寄存器 | 用途 | 调用约定 | 32位 | 16位 | 8位 |
| ------ | ---- | -------- | ----- | ----- | --- |
| ```%rax``` | 返回值 | Caller-saved | ```%eax``` | ```%ax``` | ```%al``` |
| ```%rbx``` | 基址寄存器 | Callee-saved | ```%ebx``` | ```%bx``` | ```%bl``` |
| ```%rcx``` | 传递参数 | Caller-saved | ```%ecx``` | ```%cx``` | ```%cl``` |
| ```%rdx``` | 传递参数 | Caller-saved | ```%edx``` | ```%dx``` | ```%dl``` |
| ```%rsi``` | 传递参数 | Caller-saved | ```%esi``` | ```%si``` | ```%sil``` |
| ```%rdi``` | 传递参数 | Caller-saved | ```%edi``` | ```%di``` | ```%dil``` |
| ```%rsp``` | 栈指针 | Callee-saved | ```%esp``` | ```%sp``` | ```%spl``` |
| ```%rbp``` | 帧指针 | Callee-saved | ```%ebp``` | ```%bp``` | ```%bpl``` |
| ```%r8``` | 传递参数 | Caller-saved | ```%r8d``` | ```%r8w``` | ```%r8b``` |
| ```%r9``` | 传递参数 | Caller-saved | ```%r9d``` | ```%r9w``` | ```%r9b``` |
| ```%r10``` | 临时寄存器 | Caller-saved | ```%r10d``` | ```%r10w``` | ```%r10b``` |
| ```%r11``` | 临时寄存器 | Caller-saved | ```%r11d``` | ```%r11w``` | ```%r11b``` |
| ```%r12``` - ```%r15``` | 被调用者保存寄存器 | Callee-saved | ```%r12d``` - ```%r15d``` | ```%r12w``` - ```%r15w``` | ```%r12b``` - ```%r15b``` |
| | | |
| **```%rip```** | 指令指针 | | ```%eip``` | ```%ip``` | |
| **```%rflags```** | 标志寄存器 | | ```%eflags``` | ```%flags``` | |
### Flags 标志位
| VS显示名称 | 标志位 | 全称 | 为1时表明... | 用户态可用 |
| ---------- | ------ | ---- | ---- | ---------- |
| OV | OF | **O**ver**f**low Flag | 有符号数运算结果溢出 | √ |
| UP | DF | **D**irection **F**lag | 字符串指令的处理方向递减 | √ |
| EI | IF | **I**nterrupt **F**lag | 允许外部中断 | |
| PL | SF | **S**ign **F**lag | 结果为负数 | √ |
| ZR | ZF | **Z**ero **F**lag | 结果为零 | √ |
| AC | AF | **A**uxiliary carry **F**lag | (辅助进位) | √ |
| PE | PF | **P**arity **F**lag | 结果的二进制表示中1的个数为偶数 | √ |
| CY | CF | **C**arry **F**lag | 无符号数运算结果溢出 | √ |
## GDB调试常用命令
### 程序运行控制
| 命令 | 别名 |作用 | 备注 |
| ---- | ---- | ---- | ---- |
| ```run``` | ```r``` | 运行程序 | 可以带参数,如```run arg1 arg2``` |
| ```continue``` | ```c``` | 继续执行程序 | 在断点处暂停后使用 |
| ```stepi``` | ```s``` | 单步执行 | 进入函数调用 |

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
Border relations with Canada have never been better.
1 2 4 8 16 32 64
0 207
7 0
)/.%&'
4 3 2 1 6 5