Go語言彙編

來源:互聯網
上載者:User

標籤:可見   編譯   程式   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語言彙編

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.