From 0eccb1fb7f649e262ad6ff78b083650c764635b8 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Thu, 21 Feb 2019 14:01:56 +0800 Subject: [PATCH] =?UTF-8?q?ch3:=20=E7=BB=86=E8=8A=82=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch3-asm/ch3-04-func.md | 2 +- ch3-asm/ch3-05-control-flow.md | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ch3-asm/ch3-04-func.md b/ch3-asm/ch3-04-func.md index be389b8..4f12258 100644 --- a/ch3-asm/ch3-04-func.md +++ b/ch3-asm/ch3-04-func.md @@ -14,7 +14,7 @@ TEXT symbol(SB), [flags,] $framesize[-argsize] 函数的定义部分由5个部分组成:TEXT指令、函数名、可选的flags标志、函数帧大小和可选的函数参数大小。 -其中TEXT用于定义函数符号,函数名中当前包的路径可以省略。函数的名字后面是`(SB)`,表示是函数名符号相对于SB伪寄存器的偏移量,二者组合在一起最终是绝对地址。作为全局的标识符的全局变量和全局函数的名字一般都是基于SB伪寄存器的相对地址。标志部分用于指示函数的一些特殊行为,常见的NOSPLIT主要用于指示叶子函数不进行栈分裂。framesize部分表示函数的局部变量需要多少栈空间,其中包含调用其它函数时准备调用参数的隐式栈空间。最后是可以省略的参数大小,之所以可以省略是因为编译器可以从Go语言的函数声明中推导出函数参数的大小。 +其中TEXT用于定义函数符号,函数名中当前包的路径可以省略。函数的名字后面是`(SB)`,表示是函数名符号相对于SB伪寄存器的偏移量,二者组合在一起最终是绝对地址。作为全局的标识符的全局变量和全局函数的名字一般都是基于SB伪寄存器的相对地址。标志部分用于指示函数的一些特殊行为,标志在`textlags.h`文件中定义,常见的`NOSPLIT`主要用于指示叶子函数不进行栈分裂。framesize部分表示函数的局部变量需要多少栈空间,其中包含调用其它函数时准备调用参数的隐式栈空间。最后是可以省略的参数大小,之所以可以省略是因为编译器可以从Go语言的函数声明中推导出函数参数的大小。 我们首先从一个简单的Swap函数开始。Swap函数用于交互输入的两个参数的顺序,然后通过返回值返回交换了顺序的结果。如果用Go语言中声明Swap函数,大概这样的: diff --git a/ch3-asm/ch3-05-control-flow.md b/ch3-asm/ch3-05-control-flow.md index a46240f..efd5531 100644 --- a/ch3-asm/ch3-05-control-flow.md +++ b/ch3-asm/ch3-05-control-flow.md @@ -185,7 +185,6 @@ func LoopAdd(cnt, v0, step int) int { 新的LoopAdd函数只有if/goto语句构成: ```go - func LoopAdd(cnt, v0, step int) int { var i = 0 var result = 0