Go语言汇编代码风格
Little_YangYang

伪寄存器和符号

Go的汇编器使用一些伪寄存器来简化符号管理,这些伪寄存器不是真实的硬件寄存器,而是由工具链维护的虚拟寄存器。常见的伪寄存器包括:

  • FP:帧指针,用于访问函数的参数和局部变量。
  • PC:程序计数器,主要用于分支和跳转指令。
  • SB:静态基指针,用于表示全局变量和函数的起始地址。
  • SP:栈指针,指向当前栈帧中的最高地址。

常量和表达式

Go汇编中的常量使用Go语言的优先级规则进行解析,而不是传统的C风格。例如,3&1<<2 在Go汇编中解析为 (3&1)<<2 而不是 3&(1<<2)。此外,所有常量被解析为64位无符号整数。

操作数的宽度

Go汇编中通过指令后缀来判断操作数的宽度,后缀W代表16为,后缀L代表32位,后缀Q代表64位,而不像Intel汇编中有AX,EAX,RAX等不同的寄存器名称,只使用AX,CX,等名称,使用操作数判别

1
2
INC EAX
INC RCX

对应Go汇编为

1
2
INCL AX
INCQ CX

操作数的顺序

对于常见的有两个操作数的指令,Go汇编中的操作数顺序和Intel汇编中操作数的顺序是反的,源操作数在前,目的操作数在后

1
MOV EAX,ECX

对应Go汇编为

1
MOVL CX,AX

地址的表示

有效的地址计算公式

以ESP作为基址寄存器,EBX作为索引寄存器,比例系数取2,位移为6,有如下代码

1
[ESP+EBX*2+16]

对应Go汇编为

1
16(SP)(BX*2)

立即数格式

Go汇编中的立即数类似AT&T风格,需要在前面加上$

1
MOV EAX, 123

对应Go汇编有

1
MOVL $ 123, AX

参考文献:https://go.dev/doc/asm