commit cfc02abdc582ad90e784604593784239fc25d629 Author: Void-Deer Date: Mon Mar 30 16:09:38 2026 +0800 init diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..02f7ece --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "cSpell.words": [ + "alloca", + "movslq", + "movsxd", + "pcount", + "startproc" + ] +} \ No newline at end of file diff --git a/CSAPP/L07 Procedures 函数的调用.md b/CSAPP/L07 Procedures 函数的调用.md new file mode 100644 index 0000000..060ffb8 --- /dev/null +++ b/CSAPP/L07 Procedures 函数的调用.md @@ -0,0 +1,215 @@ +# Lecture 07 Procedures 函数的调用 + +## Mechanisms 机制 / 目录 + +- [Passing Control 移交线程控制权](#passing-control-移交线程控制权) + - [Stack 栈](#stack-栈) + - [Call & Ret 函数调用](#call--ret-函数调用) +- [Passing Data 传递数据](#passing-data-传递数据) + - [传入参数](#传入参数) + - [返回值](#返回值) +- [Managing Local Data 管理其他变量](#managing-local-data-管理其他变量) + - [Stack Frame 栈帧](#stack-frame-栈帧) + - [Recursion 递归](#recursion-递归) + - [`ret` 指令](#ret-指令) +- [Register Saving Conversions 寄存器保存约定](#register-saving-conversions-寄存器保存约定) + - [x86-64 Linux System V ABI](#x86-64-linux-system-v-abi) +- [Illustration of Recursion 递归示例](#illustration-of-recursion-递归示例) + +## Passing Control 移交线程控制权 + +### Stack 栈 + +在画图时,栈底通常画在上方。 +在内存地址视角中,栈底对应较高地址,因此按地址从低到高展示时,栈底会出现在下方。 + +![栈结构示意图](/CSAPP/images/L07%20Stack%20Picture.png) + +#### 表 1:栈底在上(高地址在上) + +| 数据编号 | 数据 | 地址 | +|----------|---------|--------------------| +| #5 | 0x55 | 0x7fffffffe0a0 | +| #4 | 0x44 | 0x7fffffffe098 | +| #3 | 0x33 | 0x7fffffffe090 | +| #2 | 0x22 | 0x7fffffffe088 | +| #1 | 0x11 | 0x7fffffffe080 | + +#### 表 2:低地址在上(地址升序) + +| 地址 | 数据 | 数据编号 | +|--------------------|---------|----------| +| 0x7fffffffe080 | 0x11 | #1 | +| 0x7fffffffe088 | 0x22 | #2 | +| 0x7fffffffe090 | 0x33 | #3 | +| 0x7fffffffe098 | 0x44 | #4 | +| 0x7fffffffe0a0 | 0x55 | #5 | + +寄存器```%rsp```用于存储栈顶的当前位置。 + +- ```push ``` : 将指定内容压入栈中。系统会自动更改```rsp```寄存器的值(-8) +- ```pop ``` : 将栈顶的内容出栈并放入```dest```(必须是寄存器)。系统会自动更改```rsp```寄存器的值(+8)。 +- - 使用```pop```时,实际上不会删除内存中的某个值。它只会修改```rsp```寄存器的值。 + +### Call & Ret 函数调用 + +函数使用**栈**来进行调用、返回等操作。 + +- ```call