標籤:可見 編譯 程式 text 流程式控制制 style odata 編譯器 變數
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語言彙編