diff --git a/ch3-asm/ch3-03-const-and-var.md b/ch3-asm/ch3-03-const-and-var.md index a194d2b..ca2a724 100644 --- a/ch3-asm/ch3-03-const-and-var.md +++ b/ch3-asm/ch3-03-const-and-var.md @@ -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) + + + ## bool型变量 Go汇编语言定义变量无法指定类型信息,因此需要先通过Go语言声明变量的类型。以下是在Go语言中声明的几个bool类型变量: @@ -154,7 +173,6 @@ DATA ·float64Value(SB)/4,$0x01020304 // bit 方式初始化 我们在上一节精简的算术指令中都是针对整数,如果要通过整数指令的处理浮点数加减法必须根据浮点数的运算规则进行:先对齐小数点,然后进行整数加减法,最后再对结果进行归一化并处理精度舍入问题。 - ## string类型变量 从Go汇编语言角度看,字符串只是一种结构体。string的头结构定义如下: