ARM指令尋址方式之: 內(nèi)存訪問(wèn)指令尋址
雜類Load/Store指令的解碼格式如圖4.23所示。
圖4.23 雜類Load/Store指令解碼格式
編碼格式中各標(biāo)志位的含義如表4.5所示。
表4.5 雜類Load/Store指令編碼格式各標(biāo)志位含義
位 標(biāo) 識(shí) | 取 值 | 含 義 |
P | P=0 | 使用后索引尋址 |
P=1 | 使用偏移地址或前索引尋址(由W位決定) |
續(xù)表
位 標(biāo) 識(shí) | 取 值 | 含 義 |
U | U=0 | 訪問(wèn)的地址=基址寄存器的值-偏移量(offset) |
U=1 | 訪問(wèn)的地址=基址寄存器的值+偏移量(offset) | |
W | W=0 | 如果P=0,使用后索引尋址;P=1,指令不改變基址寄存器的值 |
W=1 | 如果P=0,未定義指令;如果P=1,將計(jì)算的內(nèi)存訪問(wèn)地址回寫(xiě)到基址寄存器 | |
L | L=0 | Store指令 |
L=1 | Load指令 | |
S | S=0 | 無(wú)符號(hào)半字內(nèi)存訪問(wèn) |
S=1 | 有符號(hào)半字內(nèi)存訪問(wèn) | |
H | H=0 | 字節(jié)訪問(wèn) |
H=1 | 半字訪問(wèn) |
注意 | 當(dāng)S=0并且H=0時(shí),并非無(wú)符號(hào)的字節(jié)內(nèi)存訪問(wèn)指令。無(wú)符號(hào)的內(nèi)存訪問(wèn)指令不使用該種尋址方式,詳見(jiàn)本章上一節(jié)。 當(dāng)S=1并且L=0時(shí),并非是有符號(hào)的存儲(chǔ)指令,而是未定義指令。ARM指令并未區(qū)分有符號(hào)和無(wú)符號(hào)的字節(jié)和半字存儲(chǔ)。 |
1.[Rn,#±offset_8>]
(1)編碼格式
指令的編碼格式如圖4.24所示。
圖4.24 雜項(xiàng)內(nèi)存訪問(wèn)指令——立即數(shù)偏移尋址編碼格式
內(nèi)存訪問(wèn)地址為基址寄存器Rn的值加(或減)立即數(shù)offset_8。
編程中,在訪問(wèn)結(jié)構(gòu)體或記錄(record)類型的變量時(shí),這些內(nèi)存的操作指令是十分有效的。另外,在子程序中,也常用這些指令訪問(wèn)本地變量和堆棧。當(dāng)offset_8=0時(shí),內(nèi)存訪問(wèn)地址即基址寄存器Rn的值。
(2)語(yǔ)法格式
LDR|STR{cond>}H|SH|SB|D Rd>,[Rn>,#±offset_12>]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪問(wèn)的基地址。
· offset_8>為8位立即數(shù),內(nèi)存訪問(wèn)地址偏移量。
(3)操作偽代碼
offset_8 = (immedH 4) OR immedL
If U = = 1 then
Address = Rn + offset_8
Else
Address = Rn – offset_8
(4)說(shuō)明
① 如果指令中沒(méi)有指定立即數(shù),使用[Rn>],編譯器按[Rn>,#0]形式編碼。
② 如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8。
評(píng)論