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

ch3-03: 增加图片

This commit is contained in:
chai2010 2018-06-15 14:19:35 +08:00
parent f6133016e5
commit 51fbc4c27e

View File

@ -33,6 +33,9 @@ $(3&1)<<2 // == $4
从Go汇编语言角度来看局部变量和局部变量也大的差异。在Go汇编中全局变量和全局函数更为相似都是通过一个认为定义的符号来引用对应的内存区别只是内存中存放是数据还是要执行的指令。因为在冯诺伊曼系统结构的计算机中指令也是数据而且指令和数据存放在统一编址的内存中因此指令和数据并没有本质的差别——我们甚至可以像操作数据那样动态生成指令。而局部变量则需了解了汇编函数之后通过SP栈空间来隐式定义。
![](../images/ch3-pkg-var-decl-01.ditaa.png)
在Go汇编语言中内存是通过SB伪寄存器定位。SB是Static base pointer的缩写意为静态内存的开始地址。所有的静态全局符号通过可以通过SB加一个偏移量定位而我们定义的符号其实就是相对于SB内存开始地址偏移量。对于SB伪寄存器全局变量和全局函数的符号并没有任何区别。
要定义全局变量,首先要声明一个变量对应的符号,以及变量对应的内存大小。导出变量符号的语法如下:
@ -74,6 +77,22 @@ DATA ·count+0(SB)/4,$0x01020304
最后还需要在Go语言中声明对应的变量和C语言头文件声明变量的作用类似这样垃圾回收器会更加变量的类型来管理其中的指针相关的内存数据。
## 变量的布局
```go
var num [2]int
```
![](../images/ch3-pkg-var-decl-02.ditaa.png)
```go
var pt image.Point
```
![](../images/ch3-pkg-var-decl-03.ditaa.png)
<!-- TODO -->
## bool型变量
Go汇编语言定义变量无法指定类型信息因此需要先通过Go语言声明变量的类型。以下是在Go语言中声明的几个bool类型变量
@ -154,7 +173,6 @@ DATA ·float64Value(SB)/4,$0x01020304 // bit 方式初始化
我们在上一节精简的算术指令中都是针对整数,如果要通过整数指令的处理浮点数加减法必须根据浮点数的运算规则进行:先对齐小数点,然后进行整数加减法,最后再对结果进行归一化并处理精度舍入问题。
## string类型变量
从Go汇编语言角度看字符串只是一种结构体。string的头结构定义如下