# 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 栈 在画图时,栈底通常画在上方。 在内存地址视角中,栈底对应较高地址,因此按地址从低到高展示时,栈底会出现在下方。 ![栈结构示意图](/CMU-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