mips公司最初設計的彙編器是乙個巨集偉的計畫,它能完成智慧型巨集的擴充套件,延遲槽填充,窺孔優化以及盡可能減少流水線堵塞而對複雜指令序列進行指令重組。不過其他的彙編器簡單多了,因為高階語言的先進編譯器技術已經可以完成這些優化工作。為了保持彙編**的相容性,同時為了讓彙編程式設計師輕鬆一點,所有的mips彙編器至少實現下列功能:
(1)進行巨集展開
(2)為了讓分支和載入指令的延遲槽對程式設計師透明,能夠在需要的地方自動插入nop指令
(3)能夠避免流水線在執行普通指令時出錯。
1,set noreord/reorder
預設彙編器處在reorder的模式下。該模式允許彙編器對指令進行重新排序,以避免流水線阻塞並獲得更好的效能,在這種模式下,是不允許在**中插入nop指令的。反之,在noreorder模式下,指令的順序不會被更改也不會對**進行任何優化。這樣做的優點是程式設計師可以完全控制**的順序執行,缺點是必須手工對指令進行排序,並在分支和載入指令的延遲槽中填上有用的指令或nop指令如:
.set noreorder
lw t0,0(a0)
nop #載入延遲槽
sub t0,1
bne t0,zero,loop
nop #分支延遲槽
.set reorder
2,set volatile/ novolatile
處在volatile區的所有訪問指令都不會被移動位置(特別是訪問指令之間的相對位置)。這一點對訪問記憶體對映裝置的暫存器非常重要。因為對於外圍裝置而言,讀寫的次序十分重要。另外對讀狀態暫存器也非常重要。因為想得到的狀態都是最新的。舉例來說,如果下面**沒有使用.set vilatile ,那麼彙編器很有可能會對第二個lw指令移到指令的前面,因為這樣可以填充第一條lw指令的延遲槽:
.set volatile
lw to,0(a0)
sw t0,0(a1)
lw t0,4(a0)
.set novolatile
3,set noat
阻止彙編器將彙編**翻譯成二進位制序列依賴at / $1 暫存器
4,set nomacro
阻止彙編器將一條彙編**翻譯成多條指令
MIPS彙編指令集
mips指令集屬於精簡指令集 mips的所有指令都是32位,指令格式簡單,而x86的指令長度不是固定的。簡單的指令和格式易於解碼和流水線操作,但是 密度不高,導致二進位制檔案大 mips有32個通用暫存器reg,為什麼是32個而不是更多呢?因為更多的暫存器需要更多的指令空間對暫存器編碼,也會增加上下...
彙編巨集指令
在學習驅動程式設計的過程中 總會遇到牛人們使用巨集運算子 想想最初知道巨集的時候還是在x86的教材中 好歹也摸爬滾打了也有不少時間 最終卻忘得光光的 現在想起來唏噓不已 今天查了下書 複習了下部分巨集運算子 在巨集呼叫時,使用該運算子能把其後表示式的結果作為實參替換,而非表示式自身 譬如某巨集 x1...
彙編 常用指令
一 資料傳送指令 mov 傳送資料 兩個運算元 xchg 交換指令 兩個運算元 movsx 擴充套件資料指令 兩個運算元 movzx 擴充套件資料指令 兩個運算元 xlat 查表指令 無運算元 push pop 入棧,出棧 乙個運算元 lea 位址傳送指令 兩個運算元 in out 輸入輸出指令 兩...