From a224d62c169e1f1f212c4d2b3c65547dfd8a4a1e Mon Sep 17 00:00:00 2001 From: sfw Date: Thu, 28 Jun 2018 15:21:41 +0800 Subject: [PATCH 1/3] 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 b14bc4b..d9b4ca2 100644 --- a/ch3-asm/ch3-04-func.md +++ b/ch3-asm/ch3-04-func.md @@ -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在汇编中两种定义方式: From eaf3b073c0a0ddb188578193e4a57f771542c4be Mon Sep 17 00:00:00 2001 From: sfw Date: Thu, 28 Jun 2018 15:26:00 +0800 Subject: [PATCH 2/3] 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 b14bc4b..bcf4e5c 100644 --- a/ch3-asm/ch3-04-func.md +++ b/ch3-asm/ch3-04-func.md @@ -31,7 +31,7 @@ TEXT ·Add(SB), $0 第一种是最完整的写法:函数名部分包含了当前包的路径,同时指明了函数的参数大小为24个字节(对应参数和返回值的3个int类型)。第二种写法则比较简洁,省略了当前包的路径和参数的大小。需要注意的是,标志参数中的NOSPLIT如果在Go语言函数声明中通过注释指明了标志,应该也是可以省略的(需要确认下)。 -目前可能遇到的函数函数标志有NOSPLIT、WRAPPER和NEEDCTXT几个。其中NOSPLIT不会生成或包含栈分裂代码,这一般用于没有任何其它函数调用的叶子函数,这样可以适当提高性能。WRAPPER标志则表示这个是一个包装函数,在panic或runtime.caller等某项处理函数帧的地方不会增加函数帧计数。最后的NEEDCTXT表示需要一个上下文参数,一般用于闭包函数。 +目前可能遇到的函数标志有NOSPLIT、WRAPPER和NEEDCTXT几个。其中NOSPLIT不会生成或包含栈分裂代码,这一般用于没有任何其它函数调用的叶子函数,这样可以适当提高性能。WRAPPER标志则表示这个是一个包装函数,在panic或runtime.caller等某项处理函数帧的地方不会增加函数帧计数。最后的NEEDCTXT表示需要一个上下文参数,一般用于闭包函数。 需要注意的是函数也没有类型,上面定义的Add函数签名可以下面任意一种格式: From d6db1c35e682db750aa5ab119613fc5364811f37 Mon Sep 17 00:00:00 2001 From: sfw Date: Thu, 28 Jun 2018 15:28:32 +0800 Subject: [PATCH 3/3] 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 b14bc4b..59467d5 100644 --- a/ch3-asm/ch3-04-func.md +++ b/ch3-asm/ch3-04-func.md @@ -31,7 +31,7 @@ TEXT ·Add(SB), $0 第一种是最完整的写法:函数名部分包含了当前包的路径,同时指明了函数的参数大小为24个字节(对应参数和返回值的3个int类型)。第二种写法则比较简洁,省略了当前包的路径和参数的大小。需要注意的是,标志参数中的NOSPLIT如果在Go语言函数声明中通过注释指明了标志,应该也是可以省略的(需要确认下)。 -目前可能遇到的函数函数标志有NOSPLIT、WRAPPER和NEEDCTXT几个。其中NOSPLIT不会生成或包含栈分裂代码,这一般用于没有任何其它函数调用的叶子函数,这样可以适当提高性能。WRAPPER标志则表示这个是一个包装函数,在panic或runtime.caller等某项处理函数帧的地方不会增加函数帧计数。最后的NEEDCTXT表示需要一个上下文参数,一般用于闭包函数。 +目前可能遇到的函数函数标志有NOSPLIT、WRAPPER和NEEDCTXT几个。其中NOSPLIT不会生成或包含栈分裂代码,这一般用于没有任何其它函数调用的叶子函数,这样可以适当提高性能。WRAPPER标志则表示这个是一个包装函数,在panic或runtime.caller等某些处理函数帧的地方不会增加函数帧计数。最后的NEEDCTXT表示需要一个上下文参数,一般用于闭包函数。 需要注意的是函数也没有类型,上面定义的Add函数签名可以下面任意一种格式: