彙編quad ARM 彙編指令集(總結)

2021-10-13 11:15:57 字數 4787 閱讀 8775

arm彙編指令集

指令、偽指令

(彙編)指令:   是機器碼的助記符,經過彙編器編譯後,由cpu執行。

(彙編)偽指令:用來指導指令執行,是彙編器的產物,最終不會生成機器碼。

有兩種不同風格的arm指令

1).arm官方的arm彙編風格:指令一般用大寫,windows中的ide開發環境。

2).gnu風格的arm彙編:指令一般用小寫。

arm彙編的特點

1. ldr/str架構

1).arm採用risc架構,cpu本身不能直接讀取記憶體,而需要先將記憶體中內容加載入cpu中通用暫存器中才能被cpu處理。

2).ldr(load register)指令將記憶體內容加載入通用暫存器。

3).str(store register)指令將暫存器內容存入記憶體空間中。

4).ldr/str組合用來實現 arm cpu和記憶體資料交換。

2. 至此8種定址方式

1).暫存器定址mov r1, r2。

2).立即(立即數)定址 mov r0, #0xff00。

3).暫存器移位定址 mov r0, r1, lsl #3。

4).暫存器間接定址 ldr r1,

[r2] 表示記憶體,記憶體位址存在r2這個暫存器中,把記憶體位址裡的值給r1。

5).基址變址定址ldr r1, [r2, #4]記憶體位址在r2+4裡面。

6).多暫存器定址 ldmia r1!, 一次訪問多個暫存器。

7).堆疊定址 stmfd sp!, 。

8).相對定址      beq flag。

3. 指令字尾

同一指令經常附帶不同字尾,變成不同的指令。經常使用的字尾有:

b(byte)功能不變,操作長度變為8位

h(half word)功能不變,長度變為16位

s(signed)功能不變,運算元變為有符號

如 ldr ldrb ldrh ldrsb ldrsh

s(s標誌)功能不變,影響cpsr標誌位

如 mov和movs movs r0, #0

4. 條件執行字尾

條件字尾是否成立取決於當前**的前面的**。

條件字尾只影響當前**的執行。

5. 多級指令流水線

為增加處理器指令流的速度,arm使用多級流水線.,下圖為3級流水線工作原理示意圖。(s5pv210使用13級流水線,arm11為8級)

允許多個操作同時處理,而非順序執行。

1).pc指向正被取指的指令,而非正在執行的指令

資料傳輸與跳轉指令詳解

1. 資料處理指令

資料傳輸指令

mov mvn

算術指令 add sub rsb adc sbc rsc

邏輯指令 and orr eor bic

比較指令 cmp cmn tst teq

乘法指令 mvl mla umull umlal smull smlal

前導零計數 clz

2. cpsr訪問指令

mrs & msr

mrs用來讀psr,msr用來寫psr

cpsr暫存器比較特殊,需要專門的指令訪問,這就是mrs和msr。

3. 跳轉(分支)指令

b & bl & bx

b 直接跳轉(就沒開啟算返回)

bl branch and link,跳轉前把返回位址放入lr中,以便返回,以便用於函式呼叫

bx跳轉同時切換到arm模式,一般用於異常處理的跳轉。

4. 訪存指令

ldr/str &

ldm/stm & swp

單個字/半字/位元組訪問 ldr/str

多字批量訪問  ldm/stm

swp r1, r2, [r0]

swp r1, r1, [r0]

5. 軟中斷指令

swi(software interrupt)

軟中斷指令用來實現os中系統呼叫

arm彙編中的立即數

合法立即數與非法立即數

arm指令都是32位,除了指令標記和操作標記外,本身只能附帶很少位數的立即數。因此立即數有合法和非法之分。

合法立即數:經過任意位數的移位後非零部分可以用8位表示的即為合法立即數。

協處理器與協處理器指令集

6.協處理器cp15操作指令

mcr & mrc

mrc用於讀取cp15中的暫存器

mcr用於寫入cp15中的暫存器

7.arm定址方式

1). 暫存器:    mov r1,r2 ; r2->r1

2). 立即數:    subs r0,r1,#1; r0=r1-1

3). 暫存器移位:mov r0,r2,lsl #3 ;r2左移三位->r0

4). 間接定址:  ldr r1,[r2] ; 裝載r2指向的記憶體數值至r1

指向的置裝入r2.r3的值不改變

6). 多暫存器定址: ldmia r1!, ; 將r1所指向的內

存塊依次裝入{}中的暫存器。

stmia r0!, ;將{}列出的暫存器裡的值依次填入r0所指向的記憶體塊。

7). 相對定址: bl *** ;跳轉

beq *** ;條件跳轉

協處理器解析:

soc內部另一處理核心,協助主cpu實現某些功能,被主cpu呼叫執行一定任務。

arm設計上支援多達16個協處理器,但是一般soc只實現其中的cp15.(cp:coprocessor)

協處理器和mmu、cache、tlb等處理有關,功能上和作業系統的虛擬位址對映、cache管理等有關。

mrc & mcr的使用方法

mcr{}   p15, , , , , {}

opcode_1:對於cp15永遠為0

rd:arm的普通暫存器

crn:cp15的暫存器,合法值是c0~c15

crm:cp15的暫存器,一般均設為c0

opcode_2:一般省略或為。

ldm/stm與棧的處理

為什麼需要多暫存器訪問指令

ldr/str每週期只能訪問4位元組記憶體,如果需要批量讀取、寫入記憶體時太慢,解決方案是stm/ldm

ldm(load register mutiple)

stm(store register mutiple)

舉例(uboot start.s 537行)

stmia

sp,

將r0存入sp指向的記憶體處(假設為0x30001000);然後位址+4(即指向0x30001004),將r1存入該位址;然後位址再+4(指向0x30001008),將r2存入該位址······直到r12內容放入(0x3001030),指令完成。

乙個訪存週期同時完成13個暫存器的讀寫

字尾的種類:

ia(increase after)先傳輸,再位址+4

ib(increase before)先位址+4,再傳輸

da(decrease after)先傳輸,再位址-4

db(decrease before)先位址-4,再傳輸

fd(full decrease)滿遞減堆疊

ed(empty decrease)空遞減堆疊

fa(·······) 滿遞增堆疊

ea(·······)空遞增堆疊

四種棧解析:

空棧:棧指標指向空位,每次存入時可以直接存入然後棧指標移動一格;而取出時需要先移動一格才能取出。

滿棧:棧指標指向棧中最後一格資料,每次存入時需要先移動棧指標一格再存入;取出時可以直接取出,然後再移動棧指標。

!的作用:

ldmia

r0,

ldmia r0!,

感嘆號的作用就是r0的值在ldm過程中發生的增加或者減少最後寫回到r0去,也就是說ldm時會改變r0的值。

^的作用:

ldmfd

sp!,

ldmfd sp!, ^

^的作用:在目標暫存器中有pc時,會同時將spsr寫入到cpsr,一般用於從異常模式返回。

總結:批量讀取或寫入記憶體時要用ldm/stm指令。

各種字尾以理解為主,不需記憶,最常見的是stmia和stmfd。

謹記:操作棧時使用相同的字尾就不會出錯,不管是滿棧還是空棧、增棧還是減棧。

常用gun偽指令:

global _start

@ 給_start外部鏈結屬性

.section .text @ 指定當前段為**段

.ascii .byte .short .long .word

.quad .float .string @ 定義資料

.align 4 @ 以4位元組對齊

.balignl 16 0xabcdefgh @ 16位元組對齊填充

.equ @ 類似於c中巨集定義

偶爾會用到的gun偽指令

.end

@標識檔案結束

.include @ 標頭檔案包含

.arm / .code32 @宣告以下為arm指令

.thumb / .code16 @宣告以下為thubm指令

重要的幾個偽指令

ldr大範圍的位址載入指令

adr 小範圍的位址載入指令

adrl 中等範圍的位址載入指令

nop 空操作

arm中有乙個ldr指令,還有乙個ldr偽指令

一般都使用ldr偽指令而不用ldr指令

adr與ldr

adr編譯時會被1條sub或add指令替代,而ldr編譯時會被一條mov指令替代或者文字池方式處理;

adr總是以pc為基準來表示位址,因此指令本身和執行位址有關,可以用來檢測程式當前的執行位址在**

@筆記記得有點不清晰,希望在學習arm在座的各位指出哪有錯,大家一起進步,共同學習。@

彙編指令集

1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓入堆疊.popa 把di,si,bp,sp,bx,dx,cx,ax依次彈...

彙編指令集

一 資料傳輸指令 它們在存貯器和暫存器 暫存器和輸入輸出埠之間傳送資料.1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓...

彙編指令集

ja jnbe 不小於或不等於時轉移.jae jnb 大於或等於轉移.jb jnae 小於轉移.jbe jna 小於或等於轉移.以上四條,測試無符號整數運算的結果 標誌c和z jg jnle 大於轉移.jge jnl 大於或等於轉移.jl jnge 小於轉移.jle jng 小於或等於轉移.以上四條...