首页 > 代码库 > 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语言汇编