plan9彙編手冊(重要!!持續更新,維護!!)

2021-10-06 17:01:23 字數 4100 閱讀 2770

我進入華為公司後,做開源生態的工作。在工作時需要用到plan9彙編指令,現在我把一些plan9的一些東西放在這裡,希望對大家有所幫助。

1)匯程式設計序中所有預定義好的符號都是大寫的。資料暫存器從r0到r7;位址暫存器從a0到a7;浮點暫存器從f0到f7。

2)其中,a6中的乙個指標被c編譯器用來指向資料,這樣可以更加頻繁的使用短位址;a6的值是常量,必須在c程式初始化外部定義的符號a6base的位址時設定。

3)在彙編器中定義了以下硬體暫存器:caar, cacr, ccr, dfc, isp, msp, sfc, sr, usp, vbr;

4)彙編器還定義了一些操縱堆疊的偽暫存器: 

fp, 

sp和 

tos。  fp

是棧幀指標,因此 

0(fp)

是第乙個引數, 

4(fp)

是第二個引數,依此類推。 

sp 是本地堆疊指標,其中儲存了自動變數; 0(sp) 是第乙個自動的,依此類推。

tos是堆疊頂部的暫存器,用於將引數推送到過程,儲存臨時值等。

5)彙編器和載入器跟蹤這些偽暫存器

。名稱 

a7指的是硬體堆疊指標,但要小心混合使用 

a7和上述與堆疊相關的偽暫存器,這會造成麻煩。還要注意, 引導程式會觀察pea

指令來更改sp,因此會在所有返回之前插入相應的彈出視窗。彙編器接受要附加到

fp和 

sp用途的類似標籤的名稱 ,例如 p + 0(fp)

,以幫助記錄 

p是例程的第乙個引數。該名稱位於符號表中,但對程式結果沒有任何意義。

1)所有外部引用必須相對於某些偽暫存器( pc (虛擬程式計數器)或 sb (「靜態基數」暫存器))進行。 pc 計算指令,而不是資料位元組。例如,要跳轉到第二條指令,即跳過一條指令,可以寫一條

bra 2(pc)
標籤允許,如

bra return

nopreturn:

rts

2)使用標籤時,沒有 (pc) 注釋。偽暫存器 sb 是指程式的位址空間的開頭。因此,對全域性資料和過程的引用被寫為sb的偏移量 ,如

movl    $array(sb), tos
將全域性陣列的位址壓入堆疊,推送陣列的第二個(4位元組)元素。注意偏移量的使用;

movl    array+4(sb), tos
定址模式的完整列表如下。同樣,子例程呼叫必須使用 sb:

bsr exit(sb)
靜態變數具有語法

local<>+4(sb)
在<> 將在載入時由乙個唯一的整數填充。

3)程式啟動時必須執行

movl    $a6base(sb), a6
所有匯程式設計序都共享簡單的定址模式。出於完整性考慮,此處列出所有68020定址模式的**,因為該機器設定最豐富。在該表中, 如果可以忽略零,o

是乙個偏移量; d是位移,它是介於-128和127之間的常數。列出的許多模式具有相同的名稱。仔細檢查格式將顯示正在應用的預設值。

1)將資料放入指令流中很容易:偽指令 

long

和 word

(但不是 

byte

)放置適當大小的單個引數的值,例如:

long    $12345   //  將12345(10進製)放置在指令流中
在資料部分中放置資訊會更加痛苦。偽指令 data 提供了兩個引數來完成這項工作:放置專案的位址(包括其大小)和放置在那裡的值。例如,要定義乙個 包含字元 abc 和終止null 的字元陣列 陣列:

data    array+0(sb)/1, $』a』

data array+1(sb)/1, $』b』

data array+2(sb)/1, $』c』

globl array(sb), $4

或者:

data    array+0(sb)/4, $"abc\z"

globl array(sb), $4

注意:

1)「/1」表示位元組數, globl 表示全球標誌和 $ 4 表示符號多少位元組佔據。未初始化的資料將自動歸零。

2)字元 「\z」等效於c中的 \ 0。data 語句中 的字串 最多可包含八個位元組。分段構建更大的字串。dynt 和 init這兩個偽指令允許(已經過時的)alef編譯器在載入階段構建動態型別資訊。該 dynt 偽指令有兩種形式:

dynt    , alef_si_5+0(sb)

dynt alef_as+0(sb), alef_si_5+0(sb)

在第一種形式中, dynt 將符號定義為乙個小的唯一整數常量,由引導程式選擇,該常量是字長的倍數。在第二種形式中, dynt 以相同的方式定義第二個符號,將第乙個符號指定的陣列中最近定義的文字符號的位址放置在第二個符號的值定義的索引處,然後調整大小相應的陣列。

該 init 偽指令採用相同的引數作為 資料 的語句。它的符號用作陣列的基礎,資料項以最新dynt 偽指令指定的偏移量安裝在陣列中 。陣列的大小會相應調整。

1)入口點由偽操作text定義,偽操作text以函式的名稱(包括普遍存在的(sb))和要在堆疊上預分配的自動儲存的位元組數作為引數。當操作時 ,該位元組數通常為零,編寫組合語言程式。這是乙個返回其兩個引數之和的完整過程:

text    sum(sb), $0

movl arg1+0(fp), r0

addl arg2+4(fp), r0

rts

2)text 偽操作的可選操作是中間引數, 是引導程式選項的位欄位。當為程式的其餘部分啟用了效能分析時,將1位置1會暫停效能分析。例如,

text    sum(sb), 1, $0

movl arg1+0(fp), r0

addl arg2+4(fp), r0

rts

1)匯程式設計序可通過 r14 和 pc來訪問 r0。堆疊指標為 r13,鏈結暫存器為 r14,靜態基址暫存器為 r12。 r0 是返回暫存器,也是儲存子例程第乙個引數的暫存器。plan9的c中的外部暫存器從r10 向下分配 。 引導程式將r11用作臨時暫存器。彙編器支援 cpsr 和 spsr 暫存器。它還知道協處理器暫存器 c0 至 c15。浮動暫存器為 f0 通過 f7, fpsr 和 fpcr。

2)與其他架構一樣,載入和儲存稱為 mov,例如 movw 用於載入字或儲存字,而 movm 用於載入或儲存多個字,具體取決於運算元。

3)指令的字尾支援定址模式: .ia (之後遞增) 、. ib (之前遞增) 、. da (之後遞減)和 .db (之前遞減)。這些只能與mov 指令一起使用 。多重移動指令 movm使用括號定義暫存器範圍,例如 [r0-r12]。特殊 movm 定址模式位 w,u,和 p 以相同的方式寫入,例如,  movm.db.w. a .s 。suffix字尾允許 movm 指令到訪問使用者在另乙個處理器模式下,r13 和 r14。二進位制運算子<> (邏輯右移), -> (算術右移)和@> (右旋轉)支援定址模式下的 移位和 旋轉。例如 r7 >> r2或 r2 @> 2。彙編器不支援通過移位表示式進行索引;只有名稱可以被雙重索引。

4)任何指令之後可以是乙個字尾,使指令有條件的: .eq, .ne,等等,如在arm手冊,利用同義詞 雜項檔案 (對於 .cs)和 .lo (對於 .cc),例如 新增。 在arm允許下,算術和邏輯指令可以帶有 .s字尾來設定條件**。

5)mcr 和 mrc 協處理器指令的語法在 很大程度上與手冊中的內容相同,並進行了常規調整。匯程式設計序僅直接支援編譯器使用的arm浮點協處理器操作: cmp, add, sub, mul和 div,所有 字尾均帶有 f 或 d字尾,用於選擇單精度或雙精度。浮點載入或儲存成為 movf 和 movd。轉換指令還通過移動指定: movwd, movwf, movdw, movwd, movfd和 movdf。

Plan9作業系統基本概念

plan9 是乙個作業系統。由貝爾實驗室開發的,其主要的負責人是rob pike 現在在google工作,負責go語言的開發 當然這個作業系統的參與者還有幾個大名鼎鼎的人 包括ken thompson c語言和unix創始人 dennis ritchie c語言和unix創始人 brain kern...

golang結合plan 9 c程式設計

這次來開下go是怎麼使用plan 9 c語言來開發一些庫的,這裡只是簡單的使用乙個簡單例子進行演示。還是看下源 吧 include runtime.h void add int32 a,int32 b,int32 r first.h 宣告first.add方法,同時引入runtime包的runtim...

僕 若手 會話(9)

連攜 僕 調 終 手 調 僕 苦手 英語 本 思 僕 君 英語 読 今 最低限 必須科目 手 相変 厳 僕 殘念 業界 新 技術 公尺國 多 會社 英語 公用語 技術 早 仕事 役立 思 英語 今 遅 勉強 方 良 手 分 時間 僕 困 今度 超有名 來日 歓迎會 兼 座談會 予算 関係 通訳 君 ...