首页 > 代码库 > Go语言汇编

Go语言汇编

Go语言的汇编基于Plan 9的汇编,但是有一些不同。最主要的一个区别是,Go语言的汇编指令不一定直接对应机器表示。有一些直接对应,有一些则不是。

Go语言的汇编和Plan 9的另一个不同是操作符的优先级。比如3&1<<2被解释成(3&1)<<2。

介绍:

编译器产生的是一些力的中间码,具体的机器指令是在汇编生成之后才定下来的(Linker的工作)。

FUNCDATA和PCDATA是编译器产生的,用于保存一些给垃圾收集的信息。

符号:

Go语言有4个伪寄存器:

FP: 帧指针,保存参数和本地变量

PC:程序指针,负责跳转和流程控制

SB:静态基指针,全局变量

SP:栈指针,栈顶

所有的符号全部携程FP和SB的偏移的形式。

SB伪寄存器用来表示全局的变量或者函数,不如foo(SB)用来表示foo的地址。加<>表示符号本文件内可见。

FP是用来保存参数的。(0)FP是第一个参数(8)FP是第二个(如果是64位机器)。

SP指向本地栈顶,分别用x-8(SP), y-4(SP)表示变量。

直接的jmp或者call指令,只能指向text符号,不能是符号的偏移。

指令:

TEXT指令定义一个符号,后面紧跟函数体。

DATA指令定义一个section的内存,这段内存并不会被初始化。

DATA    symbol+offset(SB)/width, value

GLOBAL指令定义一个符号是全局的

GLOBL divtab<>(SB), RODATA, $64GLOBL runtime·tlsoffset(SB), NOPTR, $4

divtab是制度的64byte的表格,保存4个byte的整形。tlsoffset是,4byte的no pointers

指令修饰符:

DUPOK:允许一个二进制文件里有多个实例

NOSPLIT: FOR TEXT,routine或者routine的子函数,必须把栈的空间的头填满,用来保护栈分隔

RODATA:FOR DATA/GLOBL,把数据放在只读段

NOPTR: FOR DATA/GLOBL,数据没有指针,不需要被垃圾收集扫描

WRAPPER: FOR TEXT,wrapper function,不需要被以禁用recover计数

NEEDCTXT:FOR TEXT,闭包

Runtime协作:

NOPTR和RODATA的数据不需要被垃圾收集。比指针还要小的数据也被当做NOPTR。不要在go汇编里写非只读数据。

 

Go语言汇编