我正在使用以下方法将golang代码编译为汇编程序:
go build -gcflags -S .
在汇编代码中,我说了很多行,例如:
PCDATA $2, $1
是什么意思?在quick guide to asm中指出
FUNCDATA和PCDATA指令包含由 垃圾收集器;它们是由编译引入的
但是没有很多细节
答案 0 :(得分:2)
正如您在回答中所述,A Quick Guide to Go's Assembler 指出:
<块引用>FUNCDATA 和 PCDATA 指令包含垃圾收集器使用的信息;它们是由编译器引入的。
Russ Cox 的文章 "Go 1.2 Runtime Symbol Information" 指出:
<块引用>同理,伪指令
PCDATA $3, $45
声明与当前程序计数器相关联的索引为 3 的值为 45。每个 pcdata 索引(PCDATA $1、PCDATA $2 等)都编码为单独的 pc-value 表。与 funcdata 一样,索引允许为给定函数定义多种 pcdata,并且这些索引也将有一个注册表。
在运行时,运行时可以从 Func 中检索具有给定索引的 funcdata 或在给定程序计数器中具有给定索引的 pcdata。 pcdata 流可以通过引用作为 funcdata 指针检索的相应数据来生成 int32。
struct Func 在内存中紧跟在 npcdata int32s 之后,给出 pcdata 表的偏移量;如果 nfuncdata > 0,则 npcdata int32s 后面紧跟一个可能的 int32 间隙以进行对齐,然后 nfuncdata uintptrs 给出 funcdata 值。如果 pcsp、pcfile、pcln 或任何 pcdata 偏移量为零,则认为该表丢失,所有 PC 都取值为 -1。