10分钟
3.3.2.5 string类型变量
从Go汇编语言角度看,字符串只是一种结构体。string的头结构定义如下:
type reflect.StringHeader struct {
Data uintptr
Len int
}
在amd64环境中StringHeader有16个字节大小,因此我们先在Go代码声明字符串变量,然后在汇编中定义一个16字节大小的变量:
var helloworld string
GLOBL ·helloworld(SB),$16
同时我们可以为字符串准备真正的数据。在下面的汇编代码中,我们定义了一个text当前文件内的私有变量(以<>
为后缀名),内容为“Hello World!”:
GLOBL text<>(SB),NOPTR,$16
DATA text<>+0(SB)/8,$"Hello Wo"
DATA text<>+8(SB)/8,$"rld!"
虽然text<>
私有变量表示的字符串只有12个字符长度,但是我们依然需要将变量的长度扩展为2的指数倍数,这里也就是16个字节的长度。其中NOPTR
表示text<>
不包含指针数据。
然后使用text私有变量对应的内存地址对应的常量来初始化字符串头结构体中的Data部分,并且手工指定Len部分为字符串的长度:
DATA ·helloworld+0(SB)/8,$text<>(SB) // StringHeader.Data
DATA ·helloworld+8(SB)/8,$12 // StringHeader.Len
需要注意的是,字符串是只读类型,要避免在汇编中直接修改字符串底层数据的内容。
学员评价