调用和进入 foo()
章节大纲
-
让我们关注调用 foo() 时的堆栈。我们可以忽略之前的堆栈。请注意,本解释中使用的是行号而不是指令地址。
-
第 28-29 行:这两个语句将值 1,即 foo() 的参数,推入堆栈。这个操作使 %esp 增加 4。这两个语句之后的堆栈如图 (a) 所示。
-
第 30 行:call foo:该语句将紧随 call 语句之后的下一条指令的地址推入堆栈(即返回地址)然后跳转到 foo() 的代码。当前堆栈如图 (b) 所示。
-
第 9-10 行:函数 foo() 的第一行将 %ebp 推入堆栈,以保存先前的栈帧指针。第二行让 %ebp 指向当前栈帧。当前堆栈如图 (c) 所示。
-
第 11 行:subl $8, %esp:堆栈指针被修改,以便为局部变量和传递给 printf 的两个参数分配空间(共 8 字节)。 由于函数 foo 中没有局部变量,这 8 字节仅用于参数传递。 见图 (d)。
-