From f15966d78e82e0c3956def4aaf2d9d06354f93a9 Mon Sep 17 00:00:00 2001 From: sfw Date: Thu, 28 Jun 2018 20:58:03 +0800 Subject: [PATCH] ch3-04-fix typo --- ch3-asm/ch3-04-func.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch3-asm/ch3-04-func.md b/ch3-asm/ch3-04-func.md index a7c3071..52fd980 100644 --- a/ch3-asm/ch3-04-func.md +++ b/ch3-asm/ch3-04-func.md @@ -225,7 +225,7 @@ TEXT ·bar(SB), $0-16 RET ``` -首先分析foo函数的栈帧的大小:foo函数内部有a、b两个局部变量占用16个字节,然后要需给要调用的bar函数准备的参数和返回值准备16字节的空间,因此总共有32字节的栈帧大小。在调用bar函数前我们已经计算好了栈帧的大小,Go汇编语言环境已将真实的SP寄存器调整到合适的大小,在调用函数时并不需要再手动调整SP寄存器。在调用函数bar前,真SP对应向下增长的栈顶部,因此顶部的16个字节和bar函数的参数和返回值是对应的相同的内存空间。我们将保存了b的BX寄存器内容放入`+0(SP)`位置,也就是准备bar函数的第一个参数。然后通过CALL指令进行函数调用。在bar函数内,首先从第一个参数对应的`+0(FP)`位置去取参数值存入AX寄存器,然后再将AX内容放入返回值对应的`ret+8(FP)`内存位置,最后调用RET返回。在foo函数中,调用bar函数返回后,从bar函数返回值对应的`+8(SP)`位置取出结果放到CX寄存,从而完成函数调用。 +首先分析foo函数的栈帧的大小:foo函数内部有a、b两个局部变量占用16个字节,然后要需给要调用的bar函数的参数和返回值准备16字节的空间,因此总共有32字节的栈帧大小。在调用bar函数前我们已经计算好了栈帧的大小,Go汇编语言环境已将真实的SP寄存器调整到合适的大小,在调用函数时并不需要再手动调整SP寄存器。在调用函数bar前,真SP对应向下增长的栈顶部,因此顶部的16个字节和bar函数的参数和返回值是对应的相同的内存空间。我们将保存了b的BX寄存器内容放入`+0(SP)`位置,也就是准备bar函数的第一个参数。然后通过CALL指令进行函数调用。在bar函数内,首先从第一个参数对应的`+0(FP)`位置去取参数值存入AX寄存器,然后再将AX内容放入返回值对应的`ret+8(FP)`内存位置,最后调用RET返回。在foo函数中,调用bar函数返回后,从bar函数返回值对应的`+8(SP)`位置取出结果放到CX寄存,从而完成函数调用。 调用其它函数前调用方要选择保存相关寄存器到栈中,并在调用函数返回后选择要恢复的寄存器进行保存。Go语言中函数调用是一个复杂的问题,因为Go函数不仅仅要了解函数调用函数的布局,还会涉及到栈的跳转,栈上局部变量的生命周期管理。本节只是简单了解函数调用参数的布局规则,在后续的章节中会更详细的讨论函数的细节。