在阅读 Golang 源代码时,总是被其中的汇编代码卡住,读起来不流畅。今天来简要了解下 Golang 中的汇编语言。
汇编分类
按指令集架构分类(针对 CPU)
-
x86汇编(32bit):这种架构常被称为
i386
,x86
-
x86汇编(64bit), 这种架构常被称为
AMD64
,Intel64
,x86-64
,x64
, 它是 AMD 设计的, 是 x86 架构的 64 位扩展, 后来公开 -
ARM汇编, ARM处理器由于高性能, 低耗电, 常用于嵌入式, 移动设备.
-
…
按汇编格式分类(针对人的阅读习惯)
- Intel 格式
- AT&T 格式
平时我们说 golang 中汇编属于 plan9 风格,是按第二种方式分类的,其阅读风格(符号)与 Intel 与 AT&T 都有不同。plan9 汇编作者是 unix 操作系统的同一批人,bell 实验室所开发的。
Go汇编语言是基于 plan9 汇编,但是现实世界还有这么多不同架构的 CPU 在这。所以 golang 汇编在 plan9 风格下,同一个方法还有不同指令集架构的多种实现。
在哪能看到 Golang 汇编代码
- Golang 源代码中,如
src/runtime/asm_amd64.s
,src/math/big/
… go tool compile -S main.go
,把自己编写的代码编译成汇编代码。如:在我的 Mac Intel 机器上,amd64
的架构,汇编代码生成如下:
$ cat main.go
package main
func main() {
a, b := 0, 0
println(a + b)
}
$ go tool compile -S main.go
"".main STEXT size=66 args=0x0 locals=0x10 funcid=0x0
0x0000 00000 (main.go:3) TEXT "".main(SB), ABIInternal, $16-0
0x0000 00000 (main.go:3) CMPQ SP, 16(R14)
0x0004 00004 (main.go:3) PCDATA $0, $-2
0x0004 00004 (main.go:3) JLS 57
0x0006 00006 (main.go:3) PCDATA $0, $-1
0x0006 00006 (main.go:3)