7.3 汇编基础
Go 汇编简介
go
// Go 汇编文件:add_amd64.s
/*
TEXT ·Add(SB), NOSPLIT, $0-16
MOVQ a+0(FP), AX // 加载参数 a 到 AX 寄存器
MOVQ b+8(FP), BX // 加载参数 b 到 BX 寄存器
ADDQ BX, AX // AX = AX + BX
MOVQ AX, ret+16(FP) // 存储结果到返回值
RET
*/
// 对应的 Go 声明
// func Add(a, b int64) int64
// 调用汇编函数
func main() {
result := Add(10, 20)
fmt.Println(result)
}查看汇编代码
bash
# 生成汇编代码
go tool compile -S main.go
go build -gcflags="-S" main.go
# 查看特定函数的汇编
go build -gcflags="-S -m" main.go 2>&1 | grep -A 20 "funcName"性能优化场景
go
// 内联优化
//go:noinline
func noInlineFunction(x int) int {
return x * 2
}
//go:inline
func inlineFunction(x int) int {
return x * 2
}
// 使用 intrinsic 函数
// bytes.Count 使用 SIMD 指令
n := bytes.Count(data, []byte{0})
// 手动优化热点代码
// 对于性能关键代码,可以使用汇编优化常用汇编指令
MOVQ 从/向 64 位寄存器移动数据
ADDQ 64 位加法
SUBQ 64 位减法
IMULQ 64 位乘法
IDIVQ 64 位除法
CMPQ 64 位比较
TESTQ 64 位测试
JMP 无条件跳转
JE 等于时跳转
JNE 不等于时跳转
JG 大于时跳转
JL 小于时跳转
CALL 调用函数
RET 从函数返回
LEAQ 加载有效地址