1. 程式人生 > >Sparc彙編指令介紹

Sparc彙編指令介紹

SPARCCPU指令集架構的一種,其設計的目標是優化的編譯和易用的流水線硬體執行。

SPARC指令集有以下主要特點:

    1. 線性的32位地址空間

    2. 精簡的指令格式

所有指令都是32位寬和以32為分界對齊排列的。只有3個基本指令的格式--它們是非統一的運算元位置和暫存器地址域。特別要注意的是:只有loadstore指令能訪問memoryI/O

    3. 很少的幾個地址模式,總之比x86指令的地址模式少得多

要麼是"register+register",要麼是"register+immediate"

    4. 三個一組的暫存器地址

很多指令操作是基於

2個暫存器運算元,和一個存放運算結果的暫存器。

例如:add %1,%2,%3 !%1+%2->%3

    5. A large “windowed” register file — At any one instant, a program sees 8 global integer registers plus a 24-register window into a larger register file. The windowed registers can be described as a cache of procedure arguments, local values, and return addresses

. (這裡的register file就是暫存器檔案,暫存器是暫存器檔案的簡稱。感謝CU的jamesr告訴我這一點)

    6. A separate floating-point register file

通過軟體將(浮點數)配置成32單精度(32bit)16雙精度(64bit)8四倍精度暫存器(128bit),或將它們混合。

    7. 延時控制傳輸----處理器常常是在一個延時控制傳輸指令後提取下一個指令。依靠控制傳輸指令的"annul"位判斷是否執行它。

    8. 多處理器同步指令----一個指令執行一個原子的‘讀-然後-設定儲存’的操作;另一個執行原子的‘暫存器與儲存器交換’的操作。

    9. 協處理器 (由於我使用的晶片上沒有,所以關於它的指令就不介紹了 )

SPARC暫存器組

暫存器是位於cpu片上的儲存單元。在SPARC架構中有32個通用的integer暫存器和32個浮點暫存器。在此之前,強烈推薦Peter Magnusson的一篇入門文章《Understanding stacks and registers in the Sparc architecture(s)》。

1、Interger通用暫存器組

    32個通用的integer暫存器名為%r0%r01%r2,… %r31。(由於它們在程式中執行的不同目的,又給它們起了各自的別名,peter哥的文章有介紹)

2、浮點暫存器組

    它們是%f0 .. %f31,通常用於支援實數。它們可用於成對和成組(4的很大的一個數的儲存。

3、專用暫存器組

    %psr 處理器狀態暫存器(Processor State Register)

    %wim 視窗無效遮蔽暫存器(Window Invalid Mask Register)

    %tbr Trap基址暫存器(Trap Base Register)

    %y Y暫存器(Y register)

    %y暫存器用於乘法和除法中。在除法中,暫存被除數的高32位有效位;

在乘法中,暫存乘積的高32位有效位;

    %fsr 浮點狀態暫存器(Floating-Point State Register)

    %csr 協處理器狀態暫存器(Coprocessor-State Register)

    %fq 浮點指標佇列暫存器(Floating-Point Queue)

    %cq 協處理器佇列暫存器(Coprocessor Queue)

    %hi%lo 用於一元操作,擷取運算元的高22位和低10位。 (一般用來配合sethi指令)

指令分類及指令格式

1.指令分類及簡介

SPARC指令集可以分為6大組類:load/store指令、整數運算指令、控制傳輸(CTI)指令、讀/寫控制暫存器指令、浮點操作和協處理器操作指令。

2.指令格式

SPARC指令使用的基本格式如下:

Opcode {rs1, rs2(imm), rd}

運算元的個數根據不同型別的指令而不同,由0~3個不等。如nop,是無運算元的。

基本指令格式說明指今格式中所用的英文編寫符號說明如下:

Opcode 操作碼,指令助記符,如LDSTADD

Rs1: 源運算元暫存器1內容。

Rs2: 源運算元暫存器2內容。

Imm: 立即數

Rd: 目標暫存器

基本格式中“{}”和“()”的說明:

“{ }”內的項是項是可選的,例如,{rs1, rs2, rd}為指令運算元可能沒有或有1~3個。

    “( )”表示或者,如“rs2(imm)”為要麼是暫存器運算元,要麼是立即數。        3.格式使用舉例

    指令格式舉例如下:

    add %l2, %l3, %g3 ! 本地暫存器%l2,加上%l3,結果存入到全域性暫存器%g3

                     ! 

    ld [%g3], %fsr ! 讀取g3地址的儲存單元內容,放入到浮點狀態寄存

                  ! fsr

    st %fsr, [%o2] ! fsr中的內容,存到輸出暫存器%o0內容所指地址

                 ! 的儲存單元中。

    subcc %g0, %o2, %g0 ! %g0%o2的減法運算,並對狀態暫存器的條件碼作

                       ! 相應操作

    bne ,a s1f ! 分支指令,如果%o2不為零,則跳到識別符號為s1處。

好了,經過上面那麼枯燥的介紹,下面來點更枯燥的。

SPARC定址方式

    定址方式是根據指令編碼中給出的地址碼欄位來尋找真實運算元的方式。SPARC處理器支援的基本定址方式很簡單,其儲存器地址的給出,要麼是"register+register"要麼是"register+immediate"。基本的定址方式有以下幾種。

1.立即定址

    立即定址也稱為立即數定址,是一種特殊的定址方式。運算元是直接通過指令給出,資料就包含在指令的32位編碼中,只要取出指令就可在指令執行時得到立即運算元。例如指令:

add %o1, 1, %o1 ! %o1 ← %o1 + 1

and %o2,0x0f,%o3 ! %o3 ← %o2 AND “0x0f”

    需要注意的是,在SPARC體系中,只有第二個運算元才會用到立即定址方式。那麼,SPARC處理器是如何識別立即數的呢,這要結合SPARC指令編碼格式來說明(參看V8手冊 )。其實,在有兩個源運算元的指令編碼格式中,有一位“i”標誌符起了決定性的作用。用於為(整數)算術運算和load/store指令選擇第二個運算器運算元。如果 i = 0,運算元是暫存器r[rs2];如果 i = 1,運算元是有符號立即數simm13,符號擴充套件從 13~32 bit

2.立即數的值

    另外值得注意的是立即數的取值範圍,在SPARC體系中,依不同的指令型別而不同。並用於不同的定址模式中。

    imm7:取值範圍在 -64 ~ 127 之間的立即數(用7位表示,有符號或無符號)。常用於(trap)跟蹤型別指令的偏址定址方式中。

    uimm7:取值範圍在0 ~ 127之間的立即數(用7位表示,無符號)。用於偏址定址方式中。

    simm13:取值範圍在 -4096 ~ 4095之間的立即數(用13位表示,有符號)。當i=1,用於算術運算指令或load/store指令的第二個運算器運算元。

    const22:用22位描述的常量。

    asi地址空間識別符號,一個取值範圍在0 ~ 255的立即數常量(用8位表示,無符號)。

3.暫存器定址

    SPARC指令集中除了立即數定址外,還有一種常用的是暫存器直接定址。暫存器定址利用暫存器中的數值作為運算元,指令中地址碼給出的是暫存器編號。例如:

    Add %l0, %l1, %l2 ! %l2 ← %l0 + %l1

    本指令將2個暫存器(%l0和 %l1 )的內容相加,結果放人第3個暫存器%l2中。必須注意寫運算元的順序:第1個是第1暫存器,然後是第2運算元暫存器,最後是結果暫存器。

4.暫存器間接定址

    暫存器間接定址利用一個暫存器的值作為儲存器地址,在指定的暫存器中存放有效地址,而運算元則放在儲存單元中。這個暫存器用“[ ]”括起來,表示內容。

    例如:

        ld [%o2], %f0 ! %f0 ← mem[%o2]

        st %fsr, [%o0] ! mem[%o0] ← %fsr

    第l條指今將暫存器%o2指向的地址儲存器單元的內容載入到暫存器%f0中。第2條指令將暫存器%fsr的內容儲存到暫存器%o0指向的地址儲存單元中。

5.基址加偏址定址

    基址加偏址定址也稱為變址定址,就是將基址寄存的內容與指令中給出的偏移量相加,形成儲存器的有效地址,用於訪問基址附近的儲存器單元。暫存器間接定址實質是偏移量為0的基址加偏移定址,這種定址方式有很高的執行效率且程式設計技巧很高,可編出短小但功能強大的彙編程式。

    指令可在系統儲存器合理的範圍內基址上加上不超過7位的偏移量(立即數時為7位偏移量)來計算傳送地址。

    例如:

        ld [%g1 + 96], %o1 ! %o1 ← mem[%g1 + 96]

    這條指令把基址%g1的內容加上位移量為96,所指向的儲存單元的內容送到暫存器%o1中。

6.偏移地址

    在以上的例子中基址暫存器的地址偏移一直是一個立即數。它同樣可以是另一個暫存器,並且在加到基址暫存器前還可經過移位操作。

    有些指令使用到這種址定址方式,語法定義如下:

    偏移地址可以如下方式給出:

reg1 (等價於:reg + %g0

reg1 + reg2 暫存器 暫存器

reg1 + simm13 暫存器 + (13)立即數

reg1 - simm13 暫存器 - (13)立即數

simm13 (等價於:%g0 + simm13

simm13 + reg1 (等價於:simm13 + reg

例如:

ld [%o0 + %i0], %o2 ! %o2 ← mem[%o0 + %i0]

ld [%l2 - 0x40], %o2 ! %o2 ← mem[%l2 - 0x40]

ld [0x40 + %l2], %o2 ! %o2 ← mem[0x40 + %l2]

7.相對定址

    相對定址可認為是基地址為程式計數器PC的變址定址,偏移量指出了目的地址與現行指令之問的相對位置,偏移量與PC提供的基地址相加後得到有效的目的地址。

例如:

add %g1, %g2, %g1

ba SUM3 !轉移到SUM3

sub %g3, 1, %g3

SUM3: !子程式入口地址

subcc %g3, 0, %g0

    其實上面那些東西想通了,就很容易記住了,是不是比x86簡單呀。下面的就進入本文主題了。

SPARC指令詳細介紹

SPARC指令集總體分為以下6類:

    • 算術運算/邏輯運算/移位指令

    • LOAD/STORE指令

    • 控制轉移指令

    • /寫專用暫存器指令

    • 浮點運算指令

    • 協處理器指令

    本指令集來基於SPARC V8版本,對於SPARC新增的指令請參見SPARC 最新的版本手冊。不過那些指令真的又多又煩,我只是介紹常用的。那些不怎麼用的,自己查V8手冊吧。

資料處理指令(算術運算/邏輯運算/移位指令)

SPARC的資料處理指令主要完成暫存器中資料的算術和邏輯運算操作。SPARC資料處理指令的基本原則為:

  • 所有運算元都是32位寬,或來自暫存器或是在指令中定義的立即數(符號或0擴充套件)

  • 算術運算和邏輯運算指令都要用到3個暫存器,大部分的情況下,第一和最後一個引數是雙暫存器,然而第二個引數可以是暫存器或13位有符號立即數。

  • 如果資料操作有結果,則結果為32位寬,放在一個暫存器中(有一個例外一一乘法令產生64位的結果)

  • %y暫存器用於乘法和除法中。在除法中,暫存被除數的高32位有效位;在乘法中,暫存乘積的高32位有效位;從事程式開發的人員應很清楚%y暫存器的價值,是既可用於乘法運算中檢查乘積,又可除法指令中適當地設定運算元。

彙編格式

    根據第2運算元的型別,其彙編格式分為以下2種,

    Opcode %reg, %reg, %reg

    Opcode %reg, const, %reg

    每個運算操作根據是否設定條件碼雙分成兩條指令,也就是說同一個運算操作指令,一條是會對%psr狀態碼位產生影響(帶有cc字尾的指令),而另一條則不會。另外,乘法和除法又存在有符號和無符號運算之分(區別在於指令是否有S字首)。

      1.加減法指令ADDADDccADDXccSUBSUBccSUBXcc

用法:

    這些指令是最基本的算術運算指令。其中加法ADD和減法SUB都是不區分運算元是否有符號,只是簡單地進行相關運算。如果非要給它們加上符號的考慮的話,SPARC提供了很有用的條件碼,只需在其指令助記符後加上cc。如ADDccSUBcc。這樣,運算的結果就會影響PSR相應的條件碼icc位。

關於條件碼的補充:

    在SPARC的指令集中,統一用小寫字母cc作為字尾加在指令助記符後面,表示執行時會影響相應狀態暫存器的條件碼位。SPARC條件碼有三類(icc, fcc, ccc),分別在PSRFSRCSR狀態暫存器中,而SPARC的分支跳轉指令根據這些狀態暫存器的條件位自動判斷是否執行指令。

    例如: 算術運算類中的加法指令ADD ,加上條件字尾cc後成為ADDcc,表示“相加並設定條件碼”,即執行完加的操作後,接著設定相應PSR狀態暫存器的icc條件碼標誌位。

條件碼說明:

    icc: 整數暫存器條件碼位。

    icc條件碼位,是%psr暫存器的一部分。它們在某些彙編指令執行期間被設定。它們的內容後來被查得並遵照其執行。

N(Negative)負標誌位,如果算術運算的結果最高有效位為1, 那麼置1

相關推薦

Sparc彙編指令介紹

SPARC是CPU指令集架構的一種,其設計的目標是優化的編譯和易用的流水線硬體執行。 SPARC指令集有以下主要特點:     1. 線性的32位地址空間     2. 精簡的指令格式 所有指令都是32位寬和以32為分界對齊排列的。只有3個基本指令的格式--它

常用的彙編指令介紹

注意:此文件會根據學習過程中遇到的ARM彙編指令,持續更新。 LDR彙編指令: LDR指令的格式為: LDR{條件}  目的暫存器,<儲存器地址> LDR指令用於從儲存器中將一個32位的字資料傳送到目的暫存器中。該指令通常用於從儲存器 中讀取32位的字資料到通

adb指令介紹

value dom pri should product dns whether note cache 一.adb命令格式為:adb [-d|-e|-s <serialNumber>] <command> 1.adb devices :列出當前電腦所

freemarker指令介紹

放置 格式 freemark lena number zone 模板文件 common include指令 FreeMarker 的常用指令 1、if指令 分支控制語句 語法格式如下 <#if condition>

Dockerfile指令介紹

容器技術創建Docker鏡像的方式有三種1、docker commit命令:由容器生成鏡像;2、Dockerfile文件+docker build命令;3、從本地文件系統導入:OpenVZ的模板。 1. Dockerfile主要指令簡介 Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋

【不斷更新中】記錄一下做CTF逆向題目時常用到的彙編指令

本文主要記錄自己在做CTF逆向題目過程中常用到的彙編指令 不斷更新中...... cdq指令它大多出現在除法運算之前。它實際的作用只是把EDX的所有位都設成EAX最高位的值 idiv是有符號數除法指令,完成兩個有符號數相除 memset是計算機中C/C++語言函式。

Vue.js常用指令介紹跟舉例應用

什麼是vue.js指令? 指令是帶有v-字首的特殊屬性。 vue.js指令的用途? 在表示式的值改變時,將某些行為應用到DOM上。 官方文件:https://cn.vuejs.org/v2/api/#指令 指令介紹 v-show:控制一個元素的display屬性顯示或者隱藏 v-on:為

《組合語言》實驗二——用機器指令彙編指令程式設計

.title { background-color: #4682B4 } 實驗任務一:使用debug將下面的程式寫入記憶體,逐條執行,根據指令執行後的實際執行情況填空。 前提說明:為便於驗證實驗結果,對實驗任務一做了2點調整: ①在使用a命令輸入指令除錯前,使用e命令將記憶體單元0021:0~002

彙編指令詳解

1 為什麼要寫這篇部落格 雖然近些年嵌入式開發都使用C語言,但是涉及到很底層的實現的時候,還是得用匯編來實現。所以必須要掌握基本的彙編指令。本篇部落格意在講解一些常用到的彙編指令,算是一個成長積累的過程。後續遇到的彙編指令都會記錄到本部落格中。 2 常用匯編指令學習 2.1

彙編指令長度的判斷

其中IP=IP+所讀指令的位元組數。 那麼,所讀指令的位元組數應該怎麼判斷呢? 彙編指令長度與定址方式有關,規律或原則如下: 一、沒有運算元的指令,指令長度為1個位元組 二、運算元只涉及暫存器的的指令,指令長度為2個位元組     如:mov bx,ax

8088彙編指令

8088彙編指令集   大家知不知道高手是怎樣做免殺的木馬?一個個防毒軟體的去定位特徵碼?肯定不是啦,高手要打造一個免殺的木馬就只用1分鐘,為什麼那麼快?靠的就是下面的彙編指令!

常用的ARM彙編指令

一. 帶點的(一般都是ARM GNU偽彙編指令)   1. ".text"、".data"、".bss" 依次表示的是 “以下是程式碼段”, “以下是初始化資料段”, “以下是未初始化資料段”。 2.".global" 定義一個全

C51 彙編指令英文全稱

--------------------------------------------- -- 時間:2018-10-29 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] -------------------------------

組合語言——彙編指令長度的判斷

組合語言(王爽)中,講CS:I[暫存器的地方有這樣一則圖示: 其中IP=IP+所讀指令的位元組數。 那麼,所讀指令的位元組數應該怎麼判斷呢? 彙編指令長度與定址方式有關,規律或原則如下: 一、沒有運算元的指令,指令長度為1個位元組 二、

x86彙編指令詳細學習(會更新)

剛學習彙編,菜鳥一個。記下學習筆記 mov指令: mov 目標運算元,源運算元; (類似c語言的等於號) 拷貝 源運算元 到 目標運算元。 例如 mov eax,ebx 前後的位數(寬度)必須是相同的,8位對應8位,16對應16, 32位對應32位。 (彙編有三種運算元:暫存器運算元,儲

x86彙編指令

一、資料傳輸指令   它們在存貯器和暫存器、暫存器和輸入輸出埠之間傳送資料.   1. 通用資料傳送指令.     MOV  傳送字或位元組.     MOVSX 先符號擴充套件,再傳送.     MOVZX 先零擴充套件,再傳送.     PUSH  把字壓入堆疊.     POP  把字

80x86彙編指令詳解

80x86指令系統,指令按功能可分為以下七個部分。   (1) 資料傳送指令。   (2) 算術運算指令。   (3) 邏輯運算指令。   (4) 串操作指令。   (5) 控制轉移指令。   (6) 處理器控制指令。   (7) 保護方式指令。   3.3.1資料傳送指令   資料傳送指令包括:

彙編指令ebp與esp的關係與作用

可以看到,初始情況下,ebp此時值為0012FEDC,也就是棧幀的地址,而棧頂地址esp值為0012FDFC。可以看到兩個值有一定的關係。而 幀指標 的地址較高。      然後我們讓它執行前兩句,push ebp,mov ebp

.align彙編指令的用法

先看以下程式碼:     mov r1,r0     mov r0,#12     ldr r4,str1     ldr r3, =s