1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

Merge pull request #142 from fuwensun/pr3-24

ch3-04-fix typo
This commit is contained in:
chai2010 2018-06-28 21:01:07 +08:00 committed by GitHub
commit 93c8f90465
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -147,7 +147,7 @@ func SomeFunc(FP *SomeFunc_args_and_returns) {
为了便于访问局部变量Go汇编语言引入了伪SP寄存器对应当前栈帧的底部。因为在当前栈帧时栈的底部是固定不变的因此局部变量的相对于伪SP的偏移量也就是固定的这可以简化局部变量的维护工作。SP真伪区分只有一个原则如果使用SP时有一个临时标识符前缀就是伪SP否则就是真SP寄存器。比如`a(SP)``b+8(SP)`有a和b临时前缀这里都是伪SP而前缀部分一般用于表示局部变量的名字。而`(SP)``+8(SP)`没有临时标识符作为前缀它们都是真SP寄存器。
在X86平台函数的调用栈是从高地址向低地址增长的因此伪SP寄存器对应栈帧的底部其实是对应更大的地址。当前栈的顶部对应真实存在的SP寄存器对应当前函数栈帧的栈顶对应更小的地址。如果整个内容是用Memory数组表示那么`Memory[0(SP):end-0(SP)]`就是对应当前栈帧的切片其中开始位置是真SP结尾部分是伪SP。真SP一般用于表示调用其它函数时的参数和返回值真SP对应内存较低的地址所以被访问变量的偏移量是正数而伪SP对应高地址对应的局部变量的偏移量都是负数。
在X86平台函数的调用栈是从高地址向低地址增长的因此伪SP寄存器对应栈帧的底部其实是对应更大的地址。当前栈的顶部对应真实存在的SP寄存器对应当前函数栈帧的栈顶对应更小的地址。如果整个内用Memory数组表示那么`Memory[0(SP):end-0(SP)]`就是对应当前栈帧的切片其中开始位置是真SP结尾部分是伪SP。真SP一般用于表示调用其它函数时的参数和返回值真SP对应内存较低的地址所以被访问变量的偏移量是正数而伪SP对应高地址对应的局部变量的偏移量都是负数。
我们现在用Go语言定义一个Foo函数并在函数内部定义几个局部变量