如何在Golang中获取正确格式的.s文件作为'go tool asm'输入
如何在Golang中获取正确格式的.s文件作为’go tool asm’输入 你好,
我是Go语言的新手,想修改汇编文件.s来验证一些东西。
- 作为
go tool asm的输入,Go的.s文件的正确格式是什么?当我传递go tool compile加上-S选项的输出时,它报错了。
如果你需要更多细节,请告诉我。 提前感谢。
此致, Xuan
1 回复
更多关于如何在Golang中获取正确格式的.s文件作为'go tool asm'输入的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go的汇编文件(.s)需要遵循Go汇编器的特定格式,与标准汇编有所不同。主要区别在于:
- 函数声明格式:
// 函数名需要加上包名前缀
TEXT ·函数名(SB), NOSPLIT, $帧大小-参数大小
- 寄存器命名:
- 使用虚拟寄存器:
FP(帧指针)、SP(栈指针)、PC(程序计数器) - 硬件寄存器:
AX、BX、CX、DX等
- 指令后缀:
根据操作数大小添加后缀:
MOVQ、MOVL、MOVW、MOVB
示例代码:
// file: add_amd64.s
#include "textflag.h"
TEXT ·Add(SB), NOSPLIT, $0-16
MOVQ a+0(FP), AX
MOVQ b+8(FP), CX
ADDQ CX, AX
MOVQ AX, ret+16(FP)
RET
对应的Go文件:
// file: add.go
package main
func Add(a, b int64) int64
func main() {
println(Add(1, 2))
}
编译命令:
go build
go tool compile -S输出的汇编是Go编译器的中间表示,不是有效的Go汇编输入。要获取正确格式的.s文件,可以使用:
go tool compile -S -asan main.go 2>&1 | grep -A 20 '"".main'
或者直接查看标准库的汇编文件作为参考:
# 查看runtime包的汇编实现
find $GOROOT/src/runtime -name "*.s" | head -5

