15分钟
3.1.4 定义main函数
前面的例子已经展示了如何通过汇编定义整型和字符串类型变量。我们现在将尝试用汇编实现函数,然后输出一个字符串。
先创建main.go文件,创建并初始化字符串变量,同时声明main函数:
package main
var helloworld = "你好, 世界"
func main()
然后创建main_amd64.s文件,里面对应main函数的实现:
TEXT ·main(SB), $16-0
MOVQ ·helloworld+0(SB), AX; MOVQ AX, 0(SP)
MOVQ ·helloworld+8(SB), BX; MOVQ BX, 8(SP)
CALL runtime·printstring(SB)
CALL runtime·printnl(SB)
RET
TEXT ·main(SB), $16-0
用于定义main
函数,其中$16-0
表示main
函数的帧大小是16个字节(对应string头部结构体的大小,用于给runtime·printstring
函数传递参数),0
表示main
函数没有参数和返回值。main
函数内部通过调用运行时内部的runtime·printstring(SB)
函数来打印字符串。然后调用runtime·printnl
打印换行符号。
Go语言函数在函数调用时,完全通过栈传递调用参数和返回值。先通过MOVQ指令,将helloworld对应的字符串头部结构体的16个字节复制到栈指针SP对应的16字节的空间,然后通过CALL指令调用对应函数。最后使用RET指令表示当前函数返回。
学员评价