Go语言汇编代码风格
伪寄存器和符号
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 | INC EAX |
对应Go汇编为
1 | INCL AX |
操作数的顺序
对于常见的有两个操作数的指令,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 |