PowerPC組合語言

2021-06-05 10:02:09 字數 3376 閱讀 6753

在了解指令集本身之前,有兩項關於組合語言的關鍵內容需要理解,也就是記憶體模型和獲取-執行週期。

記憶體模型非常簡單。記憶體只儲存一種東西 —— 固定範圍內的數字,也稱為位元組(在大多數計算機上,這是乙個 0 到 255 之間的數字)。每個儲存單元都使用乙個有序位址定位。設想乙個龐大的空間,其中有許多信箱。每個信箱都有編號,且大小相同。這是計算機能夠儲存的惟一 內容。因此,所有一切最終都必須儲存為固定範圍內的數字。幸運的是,大多數處理器都能夠將多個位元組結合成乙個單元來處理大數和具有不同取值範圍的數字(例如浮點數)。但特定指令處理一塊記憶體的方式與這樣乙個事實無關:每個儲存單元都以完全相同的方式儲存。除了記憶體按有序位址定位之外,處理器還維護著一組暫存器,這是容納被操縱的資料或配置開關的臨時位置。

完成這一切的實際原理極其複雜,特別是 power5 處理器可同步處理多達 5 條的指令。但上述介紹對於構思模型來說已足夠。

powerpc 體系結構按特徵可表述為載入/儲存 體系結構。這也就意味著,所有的計算都是在暫存器中完成的,而不是主儲存器中。在將資料載入暫存器以及將暫存器中的資料存入記憶體時的記憶體訪問非常簡單。這與 x86 體系結構(比如說)不同,其中幾乎每條指令都可對記憶體、暫存器或兩者同時進行操作。載入/儲存體系結構通常具有許多通用的暫存器。powerpc 具有 32 個通用暫存器和 32 個浮點暫存器,每個暫存器都有編號(與 x86 完全不同,x86 為暫存器命名而不是編號)。作業系統的 abi(應用程式二進位制介面)可能主要使用通用暫存器。還有一些專用暫存器用於容納狀態資訊並返回位址。管理級應用程式還可使用其他一些專用暫存器,但這些內容不在本文討論之列。通用暫存器在 32 位體系結構中是 32 位的,在 64 位體系結構中則是 64 位的。本文主要關注 64 位體系結構。

組合語言中的指令非常低階 —— 它們一次只能執行一項(有時可能是為數不多的幾項)操作。例如,在 c 語言中可以寫d = a + b + c - d + some_function(e, f - g),但在組合語言中,每一次加、減和函式呼叫操作都必須使用自己的指令,實際上函式呼叫可能需要使用幾條指令。有時這看上去冗長麻煩。但有三個重要的優點。第一,簡單了解組合語言能夠幫助您編寫出更好的高階**,因為這樣您就可以了解較低的級別上究竟發生了什麼。第二,能夠處理組合語言中的所有細節這一事實意味著您能夠優化速度關鍵型迴圈,而且比編譯器做得更出色。編譯器十分擅長**優化。但了解組合語言可幫助您理解編譯器進行的優化(在 gcc 中使用-s開關將使編譯器生成彙編**而不是物件**),並且還能幫您找到編譯器遺漏的地方。第三,您能夠充分利用 powerpc 晶元的強大力量,實際上這往往會使您的**比高階語言中的**更為簡潔。

這裡不再進一步解釋,接下來讓我們開始研究 powerpc 指令集。下面給出了一些對新手很有幫助的 powerpc 指令:

li reg, value載入暫存器 reg,數字為 value

add rega, regb, regc將 regb 與 regc 相加,並將結果儲存在 rega 中

addi rega, regb, value將數字 value 與 regb 相加,並將結果儲存在 rega 中

mr rega, regb將 regb 中的值複製到 rega 中

or rega, regb, regc對 regb 和 regc 執行邏輯 「或」 運算,並將結果儲存在 rega 中

ori rega, regb, value對 regb 和 value 執行邏輯 「或」 運算,並將結果儲存在 rega 中

and, andi, xor, xori, nand, nand, and nor其他所有此類邏輯運算都遵循與 「or」 或 「ori」 相同的模式

ld rega, 0(regb)使用 regb 的內容作為要載入 rega 的值的記憶體位址

lbz, lhz, and lwz它們均採用相同的格式,但分別操作位元組、半字和字(「z」 表示它們還會清除該暫存器中的其他內容)

b address跳轉(或轉移)到位址 address 處的指令

bl address對位址 address 的子例程呼叫

cmpd rega, regb比較 rega 和 regb 的內容,並恰當地設定狀態暫存器的各位

beq address若之前比較過的暫存器內容等同,則跳轉到 address

bne, blt, bgt, ble, and bge它們均採用相同的形式,但分別檢查不等、小於、大於、小於等於和大於等於

std rega, 0(regb)使用 regb 的位址作為儲存 rega 的值的記憶體位址

stb, sth, and stw它們均採用相同的格式,但分別操作位元組、半字和字

sc對核心進行系統呼叫

注意到,所有計算值的指令均以第乙個運算元作為目標暫存器。在所有這些指令中,暫存器都僅用數字指定。例如,將數字 12 載入暫存器 5 的指令是li 5, 12。我們知道,5 表示乙個暫存器,12 表示數字 12,原因在於指令格式 —— 沒有其他指示符。

每條 powerpc 指令的長度都是 32 位。前 6 位確定具體指令,其他各位根據指令的不同而具有不同功能。指令長度固定這一事實使處理器更夠更有效地處理指令。但 32 位這一限制可能會帶來一些麻煩,後文中您將會看到。大多數此類麻煩的解決方法將在本系列的第 2 部分中討論。

上述指令中有許多都利用了 powerpc 的擴充套件記憶法。也就是說,它們實際上是一條更為通用的指令的特殊形式。例如,上述所有條件跳轉指令實際上都是bc(branch conditional)指令的特殊形式。bc指令的形式是bc mode, cbit, addresscbit是條件暫存器要測試的位。mode有許多有趣的用途,但為簡化使用,若您希望在條件位得到設定時跳轉,則將其設定為 12;若希望在條件位未得到設定時跳轉,則將其設定為 4。部分重要的條件暫存器位包括:表示小於的 8、表示大於的 9、表示相等的 10。因此,指令beq address實際上就是bc 12, 10 address。類似地,liaddi的特殊形式,mror的特殊形式。這些擴充套件的記憶法有助於使 powerpc 組合語言程式更具可讀性,並且能夠編寫出更簡單的程式,同時也不會抵消更高階的程式和程式設計師可以利用的強大能力。

組合語言 AT T組合語言

這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...

組合語言 彙編指令

功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...

組合語言 《組合語言》王爽 實驗一

從 1000 0 開始寫入命令 a 1000 0 mov ax,4e20 add ax,1416 mov bx,2000 add ax,bx mov bx,ax add ax,bx mov ax,001a mov bx,0026 add al,bl add ah,bl add bh,al mov a...