1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-27 23:12:20 +00:00

Merge pull request #127 from fuwensun/pr3-9

ch3-04-fix typo
This commit is contained in:
chai2010 2018-06-27 17:05:09 +08:00 committed by GitHub
commit 2df98c8223
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,7 +4,7 @@
## 基本语法
函数标识符通过TEXT汇编指令定义表示该行开始的指令定义在TEXT内存段。TEXT语句后的指令一般对应函数的实现但是对于TEXT指令本身来说并不关心后面是否有指令。我个人绝对TEXT和LABEL定义的符号是类似的区别只是LABEL是用于跳转标号但是本质上他们都是通过标识符映射一个内存地址。
函数标识符通过TEXT汇编指令定义表示该行开始的指令定义在TEXT内存段。TEXT语句后的指令一般对应函数的实现但是对于TEXT指令本身来说并不关心后面是否有指令。我个人觉得TEXT和LABEL定义的符号是类似的区别只是LABEL是用于跳转标号但是本质上他们都是通过标识符映射一个内存地址。
![](../images/ch3-func-decl-01.ditaa.png)
@ -17,7 +17,7 @@ TEXT symbol(SB), [flags,] $framesize[-argsize]
函数的定义部分由5个部分组成TEXT指令、函数名、可选的flags标志、函数帧大小和可选的函数参数大小。
其中Text用于定义函数符号函数名中当前包的路径可以省略。函数的名字后面是`(SB)`,表示是相对于的函数名符号相对于SB伪寄存器的偏移量二者组合在一起最终是绝对地址。作为全局的标识符的全局变量和全局函数的名字一般都是基于SB伪寄存器的相对地址。标志部分用于指示函数的一些特殊行为常见的NOSPLIT主要用于指示叶子函数不进行栈分裂。framesize部分表示函数的局部变量需要多少栈空间其中包含调用其它函数是准备调用参数的隐式栈空间。最后是可以省略的参数大小之所以可以省略是因为编译器可以从Go语言的函数声明中推导出函数参数的大小。
其中Text用于定义函数符号函数名中当前包的路径可以省略。函数的名字后面是`(SB)`表示是函数名符号相对于SB伪寄存器的偏移量二者组合在一起最终是绝对地址。作为全局的标识符的全局变量和全局函数的名字一般都是基于SB伪寄存器的相对地址。标志部分用于指示函数的一些特殊行为常见的NOSPLIT主要用于指示叶子函数不进行栈分裂。framesize部分表示函数的局部变量需要多少栈空间其中包含调用其它函数是准备调用参数的隐式栈空间。最后是可以省略的参数大小之所以可以省略是因为编译器可以从Go语言的函数声明中推导出函数参数的大小。
下面是在main包中Add在汇编中两种定义方式