Golang汇编
简介
Go语言汇编基于plan9汇编,是一个中间汇编方式,以忽略底层不同架构之间的一些差别;
寄存器
Go汇编引入了4个伪寄存器,这4个寄存器是编译器用来维护上下文、特殊标识等作用的:
- PC(Program counter, 程序计数器): jumps and branches,指向指令地址
- FP(Frame pointer, 栈桢指针): arguments and locals.(指向当前栈帧),形如
symbol+offset(FP)
的方式,引用函数的输入参数。例如arg0+0(FP)
- SB(Static base pointer,全局静态基指针): global symbols.(指向全局符号表)
- SP(Stack pointer, 栈顶指针): top of stack.(指向当前栈顶部),形如
symbol+offset(SP)
的方式,引用函数的局部变量
注意:
栈是向下增长,golang的汇编是调用者维护参数返回值跟返回地址。所以FP的值小于参数跟返回值。
常用操作指令
格式:<指令> [源操作数] [目的操作数]
助记符 | 指令种类 | 用途 | 示例 | 说明 |
---|---|---|---|---|
MOVQ | 传送 | 数据传送 | MOVQ 48, AX | // 把 48 传送到 AX |
LEAQ | 传送 | 地址传送 | LEAQ AX, BX | // 把 AX 有效地址传送到 BX |
PUSHQ | 传送 | 栈压入 | PUSHQ AX | // 将 AX 内容送入栈顶位置 |
POPQ | 传送 | 栈弹出 | POPQ AX | // 弹出栈顶数据后修改栈顶指针 |
ADDQ | 运算 | 相加并赋值 | ADDQ BX, AX | // 等价于 AX+=BX |
SUBQ | 运算 | 相减并赋值 | SUBQ BX, AX | // 等价于 AX-=BX |
CMPQ | 运算 | 比较大小 | CMPQ SI CX | // 比较 SI 和 CX 的大小 |
CALL | 转移 | 调用函数 | CALL runtime.printnl(SB) | // 发起调用 |
JMP | 转移 | 无条件转移指令 | JMP 0x0185 | //无条件转至 0x0185 地址处 |
JLS | 转移 | 条件转移指令 | JLS 0x0185 | //左边小于右边,则跳到 0x0185 |
|
|
汇编示例
|
|
编译汇编
|
|
|
|