如何在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汇编器的特定格式,与标准汇编有所不同。主要区别在于:

  1. 函数声明格式
// 函数名需要加上包名前缀
TEXT ·函数名(SB), NOSPLIT, $帧大小-参数大小
  1. 寄存器命名
  • 使用虚拟寄存器:FP(帧指针)、SP(栈指针)、PC(程序计数器)
  • 硬件寄存器:AXBXCXDX
  1. 指令后缀: 根据操作数大小添加后缀:MOVQMOVLMOVWMOVB

示例代码:

// 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
回到顶部