go plan 9匯編

本文將簡單介紹一下go語言的匯編聚假。
主要的內(nèi)容如下:

  • plan 9 是什么伴郁?為什么學(xué)習(xí)plan9?
  • plan9 的常見指令
  • go程序如何轉(zhuǎn)換為plan9 ?
    下面就開始簡單介紹一下告唆。

plan 9 是什么?為什么學(xué)習(xí)plan9?

plan9, Go一套自己的匯編帆啃。按照官方文檔的說法,其設(shè)計初衷是解決跨平臺的問題窍帝,但是沒有做好努潘。并且它不同于傳統(tǒng)的匯編,也就是說要想學(xué)習(xí)go匯編坤学,你需要重新學(xué)習(xí)一套語法疯坤。社區(qū)在爭論這個問題,有人說是因為go的幾個大佬深浮,原來是用plan9的贴膘。這個問題咱們這兒不討論。
那作為普通人略号,我們學(xué)匯編干啥呢刑峡?
裝逼!這是第一生產(chǎn)力玄柠!我一直有一個不成熟的想法突梦,希望自己能夠像機器一樣看穿代碼的運行。有時想想羽利,也挺可笑的宫患。
除了裝逼,真的一點用處都沒有了嗎这弧?
當然不是M尴小!匾浪!
說下我能想到的幾個點:

  • 確定一段代碼底層執(zhí)行了什么函數(shù)
  • 查看基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)的運行機制
  • 查看內(nèi)存的分配
  • 查看go在函數(shù)頭和函數(shù)尾插入的相關(guān)的調(diào)度
    ...
    難道這幾條還不夠嗎皇帮?

plan9 的常見指令

其實匯編跟java, go等語言 沒啥區(qū)別蛋辈,無非也是變量属拾、方法等。只是我們做應(yīng)用層開發(fā)不常用而已冷溶。如果懂了基礎(chǔ)的語法渐白,其實也就這樣。下面列幾個常用的指令逞频,看不懂也沒事纯衍,多看幾遍就知道了,其實我也不是很熟苗胀,啥時候真用到襟诸,再回來看也行褒颈。

棧擴大、縮小

plan9 中棧操作并沒有使用push励堡,pop,而是采用sub 跟add SP堡掏。

SUBQ $0x18, SP // 對 SP 做減法应结,為函數(shù)分配函數(shù)棧幀
ADDQ $0x18, SP // 對 SP 做加法,清除函數(shù)棧幀

數(shù)據(jù)copy

MOVB $1, DI      // 1 byte 
MOVW $0x10, BX   // 2 bytes
MOVD $1, DX      // 4 bytes
MOVQ $-10, AX     // 8 bytes

計算指令

ADDQ  AX, BX   // BX += AX
SUBQ  AX, BX   // BX -= AX
IMULQ AX, BX   // BX *= AX

跳轉(zhuǎn)

// 無條件跳轉(zhuǎn)
JMP addr   // 跳轉(zhuǎn)到地址泉唁,地址可為代碼中的地址鹅龄,不過實際上手寫不會出現(xiàn)這種東西
JMP label  // 跳轉(zhuǎn)到標簽,可以跳轉(zhuǎn)到同一函數(shù)內(nèi)的標簽位置
JMP 2(PC)  // 以當前指令為基礎(chǔ)亭畜,向前/后跳轉(zhuǎn) x 行
JMP -2(PC) // 同上
// 有條件跳轉(zhuǎn)
JNZ target // 如果 zero flag 被 set 過扮休,則跳轉(zhuǎn)

變量聲明

在匯編里所謂的變量,一般是存儲在 .rodata 或者 .data 段中的只讀值拴鸵。對應(yīng)到應(yīng)用層的話玷坠,就是已初始化過的全局的 const、var劲藐、static 變量/常量八堡。

DATA    symbol+offset(SB)/width, value

使用 DATA 結(jié)合 GLOBL 來定義一個變量
GLOBL 必須跟在 DATA 指令之后:

DATA age+0x00(SB)/4, $18  // forever 18
GLOBL age(SB), RODATA, $4

DATA pi+0(SB)/8, $3.1415926
GLOBL pi(SB), RODATA, $8

DATA birthYear+0(SB)/4, $1988
GLOBL birthYear(SB), RODATA, $4

函數(shù)聲明

先看一個定義:

// func add(a, b int) int
//   => 該聲明定義在同一個 package 下的任意 .go 文件中
//   => 只有函數(shù)頭,沒有實現(xiàn)
TEXT pkgname·add(SB), NOSPLIT, $0-8
    MOVQ a+0(FP), AX
    MOVQ a+8(FP), BX
    ADDQ AX, BX
    MOVQ BX, ret+16(FP)
    RET

代碼存儲在TEXT段中聘芜。
pkgname 可以省略兄渺。
比如你的方法是 runtime·main,在編譯之后的程序里的符號則是 runtime.main汰现。

                             參數(shù)及返回值大小
                                  | 
 TEXT pkgname·add(SB),NOSPLIT,$32-32
       |        |               |
      包名     函數(shù)名         棧幀大小(局部變量+可能需要的額外調(diào)用函數(shù)的參數(shù)空間的總大小挂谍,但不包括調(diào)用其它函數(shù)時的 ret address 的大小)

寄存器

有4個核心的偽寄存器,這4個寄存器是編譯器用來維護上下文瞎饲、特殊標識等作用的:

FP(Frame pointer): arguments and locals
PC(Program counter): jumps and branches
SB(Static base pointer): global symbols
SP(Stack pointer): top of stack

還有很多其他的用法口叙,就先不摘抄了,后面用到再去查吧嗅战。

go程序如何轉(zhuǎn)換為plan9 ?

// 編譯
go build -gcflags="-S"
go tool compile -S hello.go
go tool compile -N -S hello.go // 禁止優(yōu)化
// 反編譯
go tool objdump <binary>

總結(jié)與后記

本文簡單的講述了plan9 是什么庐扫?什么用途? 也羅列了幾個plan9 常見的指令仗哨,增加自信形庭。最后簡單的幾行指令,教你如何看某一段代碼的plan9 指令厌漂。
如果時間允許萨醒,會結(jié)合前人的文章,針對go中常見的類型苇倡、api操作富纸、內(nèi)存分配囤踩、channel 等進行匯編指令級的學(xué)習(xí),給自己加油~

參考文獻

1晓褪、匯編 is so easy
2堵漱、Go 系列文章3 :plan9 匯編入門
3、golang內(nèi)核系列--深入理解plan9匯編&實踐

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涣仿,一起剝皮案震驚了整個濱河市勤庐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌好港,老刑警劉巖愉镰,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钧汹,居然都是意外死亡丈探,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門拔莱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碗降,“玉大人,你說我怎么就攤上這事塘秦∫怕啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵嗤形,是天一觀的道長精偿。 經(jīng)常有香客問我,道長赋兵,這世上最難降的妖魔是什么笔咽? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮霹期,結(jié)果婚禮上叶组,老公的妹妹穿的比我還像新娘。我一直安慰自己历造,他們只是感情好甩十,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吭产,像睡著了一般侣监。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臣淤,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天橄霉,我揣著相機與錄音,去河邊找鬼邑蒋。 笑死姓蜂,一個胖子當著我的面吹牛按厘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钱慢,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逮京,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了束莫?” 一聲冷哼從身側(cè)響起懒棉,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎麦箍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陶珠,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡挟裂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揍诽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诀蓉。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暑脆,靈堂內(nèi)的尸體忽然破棺而出渠啤,到底是詐尸還是另有隱情,我是刑警寧澤添吗,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布沥曹,位于F島的核電站,受9級特大地震影響碟联,放射性物質(zhì)發(fā)生泄漏妓美。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一鲤孵、第九天 我趴在偏房一處隱蔽的房頂上張望壶栋。 院中可真熱鬧,春花似錦普监、人聲如沸贵试。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毙玻。三九已至,卻和暖如春廊散,著一層夾襖步出監(jiān)牢的瞬間淆珊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工奸汇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留施符,地道東北人往声。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像戳吝,于是被迫代替她去往敵國和親浩销。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 計算機系統(tǒng)漫游 代碼從文本到可執(zhí)行文件的過程(c語言示例):預(yù)處理階段听哭,處理 #inlcude 慢洋, #defin...
    willdimagine閱讀 3,586評論 0 5
  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,615評論 1 19
  • 一陆盘、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,813評論 0 27
  • 1.地址總線普筹,數(shù)據(jù)總線,控制總線在哪里隘马,它們有什么作用?答:它們都是cpu連接外部組件的線路太防。地址總線:地址總線A...
    MagicalGuy閱讀 1,457評論 0 1
  • 今天下午,照兔爹的指示去交警隊領(lǐng)罰單酸员。我在排號機那兒鼓搗半天蜒车,看到下邊有身份證識別,就拿了身份證反復(fù)去那兒貼幔嗦。老半...
    兔娘閱讀 1,083評論 2 1