mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-23 20:02:22 +00:00
fix typo
This commit is contained in:
parent
a1a5fae2f3
commit
f0385c4cf9
4
.gitignore
vendored
4
.gitignore
vendored
@ -34,3 +34,7 @@ a.out
|
||||
|
||||
# Delve
|
||||
debug
|
||||
|
||||
# ide
|
||||
.idea/
|
||||
|
||||
|
@ -113,7 +113,7 @@ void _cgo_506f45f9fa85_Cfunc_sum(void *v) {
|
||||
}
|
||||
```
|
||||
|
||||
这个函数参数只有一个void范型的指针,函数没有返回值。真实的sum函数的函数参数和返回值均通过唯一的参数指针类实现。
|
||||
这个函数参数只有一个void泛型的指针,函数没有返回值。真实的sum函数的函数参数和返回值均通过唯一的参数指针类实现。
|
||||
|
||||
`_cgo_506f45f9fa85_Cfunc_sum`函数的指针指向的结构为:
|
||||
|
||||
@ -159,7 +159,7 @@ func sum(a, b C.int) C.int {
|
||||
func main() {}
|
||||
```
|
||||
|
||||
CGO的语法细节不在赘述。为了在C语言中使用sum函数,我们需要将Go代码编译为一个C静态库:
|
||||
CGO的语法细节不再赘述。为了在C语言中使用sum函数,我们需要将Go代码编译为一个C静态库:
|
||||
|
||||
```
|
||||
$ go build -buildmode=c-archive -o sum.a main.go
|
||||
|
@ -61,7 +61,7 @@ RET
|
||||
|
||||
第一层是TEXT指令表示函数开始,到RET指令表示函数返回。第二层是`SUBQ $16, SP`指令为当前函数帧分配16字节的空间,在函数返回前通过`ADDQ $16, SP`指令回收16字节的栈空间。我们谨慎猜测在第二层是为函数多分配了8个字节的空间。那么为何要多分配8个字节的空间呢?再继续查看第三层的指令:开始部分有两个指令`MOVQ BP, 8(SP)`和`LEAQ 8(SP), BP`,首先是将BP寄存器保持到多分配的8字节栈空间,然后将`8(SP)`地址重新保持到了BP寄存器中;结束部分是`MOVQ 8(SP), BP`指令则是从栈中恢复之前备份的前BP寄存器的值。最里面第四次层才是我们写的代码,调用runtime.printnl函数输出换行。
|
||||
|
||||
如果去掉NOSPILT标志,再重新查看生成的目标代码,会发现在函数的开头和结尾的地方又增加了新的指令。下面是经过缩进格式化的结果:
|
||||
如果去掉NOSPLIT标志,再重新查看生成的目标代码,会发现在函数的开头和结尾的地方又增加了新的指令。下面是经过缩进格式化的结果:
|
||||
|
||||
```
|
||||
TEXT "".printnl_nosplit(SB), $16
|
||||
|
Loading…
x
Reference in New Issue
Block a user