Skip to content

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  加载有效地址