ARM 指令集學習記錄

2021-10-24 01:34:34 字數 3883 閱讀 8651

通用暫存器和狀態暫存器。

通用暫存器包括r0-r15,可分為三類,未分組暫存器,分組暫存器及程式計數器。

未分組暫存器

r0-r7,儲存資料或位址。

分組暫存器

r8-r14,其中r8-r12對應兩個物理暫存器,r13-r14對應多個。

r13常用作堆疊指標。

r14稱作程式連線暫存器,lr

程式暫存器

pc,儲存下一條要執行的指令。

當前程式狀態暫存器 cpsr

nzcvq…iftm[0:4],4個8位,cxsf

w(wide)字尾指定 32 位指令。如果沒有給出字尾,彙編器會先試著用 16 位指令以縮小

**體積,如果不行再使用 32 位指令。因此,使用「.n」其實是多此一舉,不過彙編器可

能仍然允許這樣的語法。

{},操作碼 條件域

為可選字尾,使用s代表指令結果將影響cpsr

目的暫存器

第乙個運算元,為暫存器。

op2表示第二個運算元,可以是立即數、暫存器或暫存器移位運算元

定址方式是指根據指令中運算元的資訊來尋找運算元實際實體地址的方式。

lsl邏輯左移若帶s,則最高位移入cpsr中的c位。

lsr邏輯右移也會移入c位。

asr 算術右移

數值右移,左端用最高位填充。帶s移入c位

ror 迴圈右移

數值的最低位移入最高位,帶s移入c位

rrx 帶擴充套件的迴圈右移

數值的最低位移入c,c移入最高位

add第二運算元有如下表示形式

- 立即數控制的暫存器移位表示式

- 暫存器控制的暫存器移位表示式

- 數字常量表示式

數字常量表示式可以是立即數,也可以使用各種操作符。第二運算元規範:為乙個無符號的32位數,能由乙個8位無符號數,高位填0到32位後,迴圈右移偶數次得到。

adc 帶進製加法指令

實現大於32位的計算。

例,64位數存在r2,r3,第二個運算元存在r4,r5,結果存入r0,r1:

adds r0, r2, r4

adc r1, r3, r5

subsbc

rsbrsc

and rd, rn, operand ; rd = rn & operand

orr 邏輯或

eor 異或

bic 位清除

對於比較指令,不需要使用s字尾即可改變cpsr暫存器。

cmp 比較

cmn 反值比較

tst 位測試指令

teq 相等測試指令

mulmla

smull

smlal

umull

umlal

注意事項:

運算元必須為暫存器

目的暫存器不能同時作為運算元1

單暫存器儲存與載入指令,多暫存器儲存與載入指令,交換指令。

addr是儲存器位址表示式,也稱為第二運算元,可表示為[rn, offset],基址暫存器+偏移量。

位址索引: 專案

按基址+偏移量取址

基址暫存器改變

形式前索引是否

ldr r0 , [r5, #0x04]

自動索引是是

ldr r0, [r5, #0x04]!

後索引否

是ldr r0, [r5], #0x04

這種指令用於把單一的資料傳入或傳出乙個暫存器。支援的資料有字、半字、位元組。常用載入儲存指令如下:

ldr/str

ldrb/strb

ldrh/strh

ldrsb/ldrsh 有符號位元組 / 半字載入指令

ldr/str 字載入/儲存指令

機器碼格式:省略

彙編格式::ldr{}rd,addr

ldm/stm

彙編格式:ldm/stm{}{}rn,

type表示型別,用於資料儲存與讀取:

ia 每次傳送後位址值加

ib 每次傳送前位址值加

da 每次傳送後位址值減

db 每次傳送前位址值減

用於堆疊:

fd 滿遞減

fa 滿遞增

ed 空遞減

ea 空遞增

note:既然遞增遞減儲存暫存器順序一致,為什麼還要如此

滿堆疊:棧頂指標指向最後乙個資料項的位置。

空堆疊:棧頂指標指向第乙個空閒的位置。

arm制定了atpcs標準,堆疊被定義為滿遞減式堆疊。

arm**棧和進棧都是以字為單位。

stmfd = s***b

ldmfd = ldmia

swpswpb

關於位元組交換,儲存器只交換低八位嗎??

比較並跳轉指令,為迴圈結構設計,只能向前跳轉。語法格式為:

mrs mov to reg from stat

msr mov to stat from reg

swiadr 小範圍位址讀取

adrl 中等範圍位址讀取

ldr 大範圍

nop 空操作

暫存器操作有限制。

定址方式有幾種? 分別舉例說明.

立即數定址 mov r0, #0x02

暫存器定址 add r0, r1, r2

暫存器間接定址 取儲存器 ldr r0, [r1]

暫存器移位定址 add r0, r1, r2, lsl #2

基址變址定址 [暫存器+偏移量] ldr r0, [r1, #4] ldr r0, [r1, r2]

多暫存器定址 ldm r0!,

相對定址 適用於pc

bl proc

proc mov r0, #2

堆疊定址

ldmfd r13!,;

stmfd r13!

,;

arm指令系統對字、半字、位元組的訪問是如何實現的?

ldr 字直接訪問,ldrh,ldrb,位元組從暫存器儲存到儲存器的過程,只能傳送暫存器最低8位,複製四次,儲存器具體如何儲存要看指令位址和儲存器的結構。從儲存器到暫存器的載入過程,可以選擇任何乙個儲存器的位址單元,不要求位址對齊。傳送時傳送位元組放到低八位,其餘位置0,最後載入到暫存器中。半字載入同理,儲存過程未提及。

如何從arm指令集跳轉到thumb指令集?

bx blx

arm指令集支援哪幾種協處理器?

待填

arm指令條件碼有多少個?預設的條件碼是什麼

16種條件碼,最後乙個保留,不能使用。預設條件碼時al

arm指令中第二運算元有哪幾種形式?試舉例說明。

可以是立即數,暫存器,或暫存器移位運算元三種。

add r0, #4

add r0, r1, r2

add r0, r1, r2, lsl #2

mov指令和ldr指令有什麼區別?

mov指令只在暫存器間移動資料或把立即數移動到暫存器,ldr可以把儲存器中的資料載入到暫存器中。

開啟中斷和關閉中斷

mrs r1, cpsr

bic r0, r1,

0x80

msr cpsr, r0

mrs r1, cpsr

orr r1,

0x80

msr cpsr_c, r1

即上方符號中的變數操作,多出rlist操作,對乙個通用暫存器列表定義名稱。

reglist rlist 

stmfd sp!

, reglist

ldmfd sp!

, reglist

ARM 指令集 比較指令

譯註 cmp 和 cmp 是算術指令,teq 和 tst 是邏輯指令。把它們歸入一類的原因是它們的 s 位總是設定的,就是說,它們總是影響標誌位。compare negative cmn status op 1 op 2 cmn同於cmp,但它允許你與小負值 運算元 2 的取負的值 進行比較,比如難...

ARM指令集 SWP指令

arm指令集 swp指令 swp和swpb是arm指令集中對儲存單元的原子操作,即對儲存單元的一次讀和一次不可被分割。swp和swpb分別完成儲存器和暫存器之間 乙個字 32bit 和乙個位元組 8bit 的資料交換。swp指令主要是完成arm體系架構處理器的同步操作,在linux作業系統中實現訊號...

Arm指令集 偽指令

目錄 arm指令集 跳轉指令 資料處理 程式狀態暫存器傳輸指令 load srote指令 協處理器指令 異常中斷產生指令 gnu arm偽指令 資料定義 彙編控制 其他指令 blx register string abcd efgh hello asciz qwer sun world ascii ...