ARM指令尋址方式之: 內(nèi)存訪(fǎng)問(wèn)指令尋址
掃描二維碼
隨時(shí)隨地手機(jī)看文章
根據(jù)內(nèi)存訪(fǎng)問(wèn)指令的分類(lèi),內(nèi)存訪(fǎng)問(wèn)指令的尋址方式可以分為以下幾種。
① 字及無(wú)符號(hào)字節(jié)的Load/Store指令的尋址方式。
② 雜類(lèi)Load/Store指令的尋址方式。
③ 批量Load/Store指令的尋址方式。
④ 協(xié)處理器Load/Store指令的尋址方式。
4.2.1 字及無(wú)符號(hào)字節(jié)的Load/Store指令的尋址方式字及無(wú)符號(hào)字節(jié)的Load/Store指令語(yǔ)法格式如下:
LDR|STR{<cond>}{B}{T} <Rd>,<addressing_mode>
其中<addressing_mode>共有9種尋址方式,如表4.2所示。
表4.2 字及無(wú)符合字節(jié)的Load/Store指令的尋址方式
格 式
模 式
1
[Rn,#±<offset_12>]
立即數(shù)偏移尋址
(Immediate offset)
2
[Rn,±Rm]
寄存器偏移尋址
(Register offset)
3
[Rn,Rm,<shift>#< offset_12>]
帶移位的寄存器偏移尋址
(Scaled register offset)
4
[Rn,#±< offset_12>]!
立即數(shù)前索引尋址
(Immediate pre-indexed)
5
[Rn,±Rm]!
寄存器前索引尋址
(Register post-indexed)
6
[Rn,Rm,<shift>#< offset_12>]!
帶移位的寄存器前索引尋址
(Scaled register pre-indexed)
7
[Rn],#±< offset_12>
立即數(shù)后索引尋址
(Immediate post-indeded)
8
[Rn],±<Rm>
寄存器后索引尋址
(Register post-indexed)
9
[Rn],±<Rm>,<shift>#< offset_12>
帶移位的寄存器后索引尋址
(Scaled register post-indexed)
字及無(wú)符號(hào)字節(jié)的Load/Store指令的解碼格式如圖4.13所示。
圖4.13 字及無(wú)符號(hào)字節(jié)的Load/Store指令的解碼格式
編碼格式中各位的含義如表4.3所示。
表4.3 字和無(wú)符號(hào)半字Load/Store指令編碼格式各位含義
位 標(biāo) 識(shí)
取 值
含 義
P
P=0
使用后索引尋址
P=1
使用偏移地址或前索引尋址(由W位決定)
U
U=0
訪(fǎng)問(wèn)的地址=基址寄存器的值-偏移量(offset)
U=1
訪(fǎng)問(wèn)的地址=基址寄存器的值+偏移量(offset)
B
B=0
字訪(fǎng)問(wèn)Load/Store
B=1
無(wú)符號(hào)字節(jié)訪(fǎng)問(wèn)Load/Store
W
W=0
如果P=0,該指令為L(zhǎng)DR、LDRB、STR或STRB指令,且內(nèi)存訪(fǎng)問(wèn)指令為正常訪(fǎng)問(wèn)指令;如果P=1,指令執(zhí)行不更新基地址
W=1
如果P=0,該指令為L(zhǎng)DRBT、LDRT、STRBT或STRT,且指令為非特權(quán)(用戶(hù)模式)訪(fǎng)問(wèn)指令;如果P=1,計(jì)算內(nèi)存地址并更新基地址
L
L=0
Store指令
L=1
Load指令
1.[Rn,#±<offset_12>](1)編碼格式
指令的編碼格式如圖4.14所示。
圖4.14 內(nèi)存訪(fǎng)問(wèn)指令——立即數(shù)偏移尋址編碼格式
內(nèi)存訪(fǎng)問(wèn)地址為基址寄存器Rn的值加(或減)立即數(shù)offset_12。
編程中,在訪(fǎng)問(wèn)結(jié)構(gòu)體或記錄(record)類(lèi)型的變量時(shí),這些內(nèi)存的操作指令是十分有效的。另外,在子程序中也常用這些指令訪(fǎng)問(wèn)本地變量和堆棧。
(2)語(yǔ)法格式
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,#±<offset_12>]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <offset_12>為12位立即數(shù),內(nèi)存訪(fǎng)問(wèn)地址偏移量。
(3)操作偽代碼
If U = = 1 then
Address = Rn + offset_12
Else
Address = Rn – offset_12
(4)說(shuō)明
① 如果指令中沒(méi)有指定立即數(shù),使用[<Rn>],編譯器按[<Rn>,#0]形式編碼。
② 如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8。
2.[Rn,±Rm](1)編碼格式
指令的編碼格式如圖4.15所示。
圖4.15 內(nèi)存訪(fǎng)問(wèn)指令——寄存器偏移尋址編碼格式
內(nèi)存訪(fǎng)問(wèn)地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。
該尋址方式適合使用指針訪(fǎng)問(wèn)字節(jié)數(shù)組中的數(shù)據(jù)成員。
(2)語(yǔ)法格式
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量。
(3)操作偽代碼
If U = = 1 then
Address = Rn + Rm
Else
Address = Rn – Rm
(4)說(shuō)明
如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的執(zhí)行結(jié)果不可預(yù)知。
3.[Rn,Rm,<shift>#< offset_12>](1)編碼格式
指令的編碼格式如圖4.16所示。
圖4.16 內(nèi)存訪(fǎng)問(wèn)指令——帶移位的寄存器偏移尋址編碼格式
內(nèi)存地址為Rn的值加/減通過(guò)移位操作后的Rm的值。
當(dāng)數(shù)組中的成員長(zhǎng)度大于1個(gè)字節(jié)時(shí),使用該尋址方式可高效率地訪(fǎng)問(wèn)數(shù)組成員。
(2)語(yǔ)法格式
語(yǔ)法格式有以下5種。
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,LSL #< offset_12>]
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,LSR #< offset_12>]
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,ASR #< offset_12>]
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,ROR #< offset_12>]
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,RRX]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量;
· LSL表示邏輯左移操作;
· LSR表示邏輯右移操作;
· ASR表示算術(shù)右移操作;
· ROR表示循環(huán)右移操作;
· RRX表示擴(kuò)展的循環(huán)右移。
· <shift_imm>為移位立即數(shù)。
(3)操作偽代碼
Case shift of
0b00 /*LSL*/
Index = Rm logic_shift_left shift_imm
0b01 /*LSR*/
If shift_imm = = 0 then /*LSR #32*/
Index = 0
Else
Index = Rm logical_shift_right shift_imm
0b10 /*ASR*/
If shift_imm = = 0 then /*ASR #32*/
If Rm[31] = = 1 then
Index = 0xffffffff
Else
Index = 0
Else
Index = Rm Arithmetic_shift_Right shift_imm
0b11 /* ROR or RRX*/
If shift_imm = = 0 then /*RRX*/
Index = (C flag Logical_shift_left 31) OR
(Rm logical_shift_Right 1)
Else /*ROR*/
Index = Rm Rotate_Right shift_imm
Endcase
If U = = 1 then
Address = Rn + index
Else /*U = = 0*/
Address = Rn – index
(4)說(shuō)明
如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的執(zhí)行結(jié)果不可預(yù)知。
4.[Rn,#±< offset_12>]!(1)編碼格式
指令的編碼格式如圖4.17所示。
圖4.17 內(nèi)存訪(fǎng)問(wèn)指令——前索引立即數(shù)偏移尋址編碼格式
內(nèi)存地址為基址寄存器Rn加/減立即數(shù)offset_8的值。當(dāng)指令執(zhí)行的條件<cc>滿(mǎn)足時(shí),生成的地址寫(xiě)回基址寄存器Rn中。
該尋址方式適合訪(fǎng)問(wèn)數(shù)組自動(dòng)進(jìn)行數(shù)組下標(biāo)的更新。
(2)語(yǔ)法格式
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<offset_12>] !
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <offset_12>為12位立即數(shù),內(nèi)存訪(fǎng)問(wèn)地址偏移量;
· !設(shè)置指令編碼中的W位,更新指令基址寄存器。
(3)操作偽代碼
If U == 1 then
Address = Rn + offset_12
Else
Address = Rn – offset_12
If ConditionPassed{cond} then
Rn = address
(4)說(shuō)明
① 如果指令中沒(méi)有指定立即數(shù),使用[<Rn>],編譯器按[<Rn>,#0] ! 形式編碼。
② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。
5.[Rn,±Rm]!(1)編碼格式
指令的編碼格式如圖4.18所示。
圖4.18 內(nèi)存訪(fǎng)問(wèn)指令——前索引寄存器偏移尋址編碼格式
內(nèi)存訪(fǎng)問(wèn)地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。當(dāng)指令的執(zhí)行條件<cc>滿(mǎn)足時(shí),生成地地址將寫(xiě)回基址寄存器。
(2)語(yǔ)法格式
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量;
· !設(shè)置指令編碼中的W位,更新指令基址寄存器。
(3)操作偽代碼
If U = = 1 then
Address = Rn + Rm
Else
Address = Rn – Rm
If ConditionPassed{cond} then
Rn = address
(4)說(shuō)明
如果Rn和Rm指定為同一寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。
6.[Rn,±Rm,<shift>#< offset_12>]!(1)編碼格式
指令的編碼格式如圖4.19所示。
圖4.19 內(nèi)存訪(fǎng)問(wèn)指令——帶移位的前索引寄存器偏移尋址編碼格式
內(nèi)存地址為Rn的值加/減通過(guò)移位操作后的Rm的值。當(dāng)指令的執(zhí)行條件<cc>滿(mǎn)足時(shí),生成地地址將寫(xiě)回基址寄存器。
(2)語(yǔ)法格式
語(yǔ)法格式有以下5種。
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,LSL #< offset_12>] !
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,LSR #< offset_12>] !
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,ASR #< offset_12>] !
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,ROR #< offset_12>] !
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>,RRX] !
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量;
· LSL表示邏輯左移操作;
· LSR表示邏輯右移操作;
· ASR表示算術(shù)右移操作;
· ROR表示循環(huán)右移操作;
· RRX表示擴(kuò)展的循環(huán)右移。
· <shift_imm>為移位立即數(shù)。
· !設(shè)置指令編碼中的W位,更新指令基址寄存器。
(3)操作偽代碼
Case shift of
0b00 /*LSL*/
Index = Rm logic_shift_left shift_imm
0b01 /*LSR*/
If shift_imm = = 0 then /*LSR #32*/
Index = 0
Else
Index = Rm logical_shift_right shift_imm
0b10 /*ASR*/
If shift_imm = = 0 then /*ASR #32*/
If Rm[31] = = 1 then
Index = 0xffffffff
Else
Index = 0
Else
Index = Rm Arithmetic_shift_Right shift_imm
0b11 /* ROR or RRX*/
If shift_imm = = 0 then /*RRX*/
Index = (C flag Logical_shift_left 31) OR
(Rm logical_shift_Right 1)
Else /*ROR*/
Index = Rm Rotate_Right shift_imm
Endcase
If U = = 1 then
Address = Rn + index
Else /*U = = 0*/
Address = Rn – index
If ConditionPassed{cond} then
Rn = address
(4)說(shuō)明
① 當(dāng)PC用作基址寄存器Rn或Rm時(shí),指令執(zhí)行結(jié)果不可預(yù)知。
② 當(dāng)Rn和Rm是同一個(gè)寄存器時(shí),指令的執(zhí)行結(jié)果不可預(yù)知。
7.[Rn],#±< offset_12>(1)編碼格式
指令的編碼格式如圖4.20所示。
圖4.20 內(nèi)存訪(fǎng)問(wèn)指令——后索引立即數(shù)偏移尋址編碼格式
指令使用基址寄存器Rn的值作為實(shí)際內(nèi)存訪(fǎng)問(wèn)地址。當(dāng)指令的執(zhí)行條件滿(mǎn)足時(shí),將基址寄存器的值加/減偏移量產(chǎn)生新的地址值回寫(xiě)到Rn寄存器中。
(2)語(yǔ)法格式
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>],±<offset_12>
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <offset_12>為12位立即數(shù),內(nèi)存訪(fǎng)問(wèn)地址偏移量。
(3)操作偽代碼
Address = Rn
If conditionPassed{cond} then
If U = = 1 then
Rn = Rn + offset_12
Else
Rn = Rn – offset_12
(4)說(shuō)明
① LDRBT、LDRT、STRBT和STRT指令只支持后索引尋址。
② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。
8.[Rn],±<Rm>(1)編碼格式
指令的編碼格式如圖4.21所示。
圖4.21 內(nèi)存訪(fǎng)問(wèn)指令——后索引寄存器偏移尋址編碼格式
指令訪(fǎng)問(wèn)地址為實(shí)際的基址寄存器的值。當(dāng)指令的執(zhí)行條件滿(mǎn)足時(shí),將基址寄存器的值加/減索引寄存器Rm的值回寫(xiě)到Rn基址寄存器。
(2)語(yǔ)法格式
LDR|STR{<cond>}{B}{T} <Rd>,[Rn],±<Rm>
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量。
(3)操作偽代碼
Address = Rn
If conditionPassed{cond} then
If U = = 1 then
Rn = Rn + Rm
Else
Rn = Rn – Rm
(4)說(shuō)明
① LDRBT、LDRT、STRBT和STRT指令只支持后索引尋址。
② 如果Rm和Rn指定為同一寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。
9.[Rn],±Rm,<shift>#< offset_12>](1)編碼格式
指令的編碼格式如圖4.22所示。
圖4.22 內(nèi)存訪(fǎng)問(wèn)指令——帶移位的后索引寄存器偏移尋址編碼格式
實(shí)際的內(nèi)存訪(fǎng)問(wèn)地址為寄存器Rn的值。當(dāng)指令的執(zhí)行條件滿(mǎn)足時(shí),將基址寄存器值加/減一個(gè)地址偏移量產(chǎn)生新的地址值。
(2)語(yǔ)法格式
語(yǔ)法格式有以下5種。
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>],±<Rm>,LSL #< offset_12>
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>],±<Rm>,LSR #< offset_12>
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>],±<Rm>,ASR #< offset_12>
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>],±<Rm>,ROR #< offset_12>
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>],±<Rm>,RRX
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量;
· LSL表示邏輯左移操作;
· LSR表示邏輯右移操作;
· ASR表示算術(shù)右移操作;
· ROR表示循環(huán)右移操作;
· RRX表示擴(kuò)展的循環(huán)右移。
· <shift_imm>為移位立即數(shù)。
(3)操作偽代碼
Address = Rn
Case shift of
0b00 /*LSL*/
Index = Rm logic_shift_left shift_imm
0b01 /*LSR*/
If shift_imm = = 0 then /*LSR #32*/
Index = 0
Else
Index = Rm logical_shift_right shift_imm
0b10 /*ASR*/
If shift_imm = = 0 then /*ASR #32*/
If Rm[31] = = 1 then
Index = 0xffffffff
Else
Index = 0
Else
Index = Rm Arithmetic_shift_Right shift_imm
0b11 /* ROR or RRX*/
If shift_imm = = 0 then /*RRX*/
Index = (C flag Logical_shift_left 31) OR
(Rm logical_shift_Right 1)
Else /*ROR*/
Index = Rm Rotate_Right shift_imm
Endcase
If ConditionPassed{cond} then
If U = = 1 then
Rn = Rn + index
Else /*U = = 0*/
Rn = Rn – index
(4)說(shuō)明
① LDRBT、LDRT、STRBT和STRT指令只支持后索引尋址。
② 當(dāng)PC用作基址寄存器Rn或Rm時(shí),指令執(zhí)行結(jié)果不可預(yù)知。
③ 當(dāng)Rn和Rm是同一個(gè)寄存器時(shí),指令的執(zhí)行結(jié)果不可預(yù)知。
4.2.2 雜類(lèi)Load/Store指令的尋址方式使用該類(lèi)尋址方式的指令的語(yǔ)法格式如下。
LDR|STR{<cond>}H|SH|SB|D <Rd>,<addressing_mode>
使用該類(lèi)尋址方式的指令包括:(有符號(hào)/無(wú)符號(hào))半字Load/Store指令、有符號(hào)字節(jié)Load/Store指令和雙字Load/Store指令。
該類(lèi)尋址方式分為6種類(lèi)型,如表4.4所示。
表4.4 雜類(lèi)Load/Store指令的尋址方式
格 式
模 式
1
[Rn,#±<offset_8>]
立即數(shù)偏移尋址
(Immediate offset)
2
[Rn,±Rm]
寄存器偏移尋址
(Register offset)
3
[Rn,#±< offset_8>]!
立即數(shù)前索引尋址
(Immediate pre-indexed)
4
[Rn,±Rm]!
寄存器前索引尋址
(Register post-indexed)
5
[Rn],#±< offset_8>
立即數(shù)后索引尋址
(Immediate post-indeded)
6
[Rn],±<Rm>
寄存器后索引尋址
(Register post-indexed)
雜類(lèi)Load/Store指令的解碼格式如圖4.23所示。
圖4.23 雜類(lèi)Load/Store指令解碼格式
編碼格式中各標(biāo)志位的含義如表4.5所示。
表4.5 雜類(lèi)Load/Store指令編碼格式各標(biāo)志位含義
位 標(biāo) 識(shí)
取 值
含 義
P
P=0
使用后索引尋址
P=1
使用偏移地址或前索引尋址(由W位決定)
續(xù)表
位 標(biāo) 識(shí)
取 值
含 義
U
U=0
訪(fǎng)問(wèn)的地址=基址寄存器的值-偏移量(offset)
U=1
訪(fǎng)問(wèn)的地址=基址寄存器的值+偏移量(offset)
W
W=0
如果P=0,使用后索引尋址;P=1,指令不改變基址寄存器的值
W=1
如果P=0,未定義指令;如果P=1,將計(jì)算的內(nèi)存訪(fǎng)問(wèn)地址回寫(xiě)到基址寄存器
L
L=0
Store指令
L=1
Load指令
S
S=0
無(wú)符號(hào)半字內(nèi)存訪(fǎng)問(wèn)
S=1
有符號(hào)半字內(nèi)存訪(fǎng)問(wèn)
H
H=0
字節(jié)訪(fǎng)問(wèn)
H=1
半字訪(fǎng)問(wèn)
注意
當(dāng)S=0并且H=0時(shí),并非無(wú)符號(hào)的字節(jié)內(nèi)存訪(fǎng)問(wèn)指令。無(wú)符號(hào)的內(nèi)存訪(fǎng)問(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)存訪(fǎng)問(wèn)指令——立即數(shù)偏移尋址編碼格式
內(nèi)存訪(fǎng)問(wèn)地址為基址寄存器Rn的值加(或減)立即數(shù)offset_8。
編程中,在訪(fǎng)問(wèn)結(jié)構(gòu)體或記錄(record)類(lèi)型的變量時(shí),這些內(nèi)存的操作指令是十分有效的。另外,在子程序中,也常用這些指令訪(fǎng)問(wèn)本地變量和堆棧。當(dāng)offset_8=0時(shí),內(nèi)存訪(fǎng)問(wèn)地址即基址寄存器Rn的值。
(2)語(yǔ)法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,#±<offset_12>]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址。
· <offset_8>為8位立即數(shù),內(nèi)存訪(fǎng)問(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。
2.[Rn,±Rm](1)編碼格式
指令的編碼格式如圖4.25所示。
圖4.25 雜項(xiàng)內(nèi)存訪(fǎng)問(wèn)指令——寄存器偏移尋址編碼格式
內(nèi)存訪(fǎng)問(wèn)地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。
該尋址方式適合使用指針訪(fǎng)問(wèn)數(shù)組中的單個(gè)數(shù)據(jù)成員。
(2)語(yǔ)法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<Rm>]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量。
(3)操作偽代碼
If U = = 1 then
Address = Rn + Rm
Else
Address = Rn – Rm
(4)說(shuō)明
如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的執(zhí)行結(jié)果不可預(yù)知。
3.[Rn,#±< offset_8>]!(1)編碼格式
指令的編碼格式如圖4.26所示。
圖4.26 雜類(lèi)內(nèi)存訪(fǎng)問(wèn)指令——前索引立即數(shù)偏移尋址編碼格式
內(nèi)存地址為基址寄存器Rn加/減立即數(shù)offset_8的值。當(dāng)指令執(zhí)行的條件<cc>滿(mǎn)足時(shí),生成的地址寫(xiě)回基址寄存器Rn中。
該尋址方式適合訪(fǎng)問(wèn)數(shù)組自動(dòng)進(jìn)行數(shù)組下標(biāo)的更新。
(2)語(yǔ)法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<offset_8>] !
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <offset_8>為8位立即數(shù),內(nèi)存訪(fǎng)問(wèn)地址偏移量,在指令編碼格式中被拆為immedH和immedL兩部分;
· !設(shè)置指令編碼中的W位,更新指令基址寄存器。
(3)操作偽代碼
offset_8 = (immedH) << 4 OR immedL
If U == 1 then
Address = Rn + offset_8
Else
Address = Rn – offset_8
If ConditionPassed{cond} then
Rn = address
(4)說(shuō)明
① 如果指令中沒(méi)有指定立即數(shù),使用[<Rn>],編譯器按[<Rn>,#0] ! 形式編碼。
② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。
4.[Rn,±Rm] !(1)編碼格式
指令的編碼格式如圖4.27所示。
圖4.27 雜項(xiàng)內(nèi)存訪(fǎng)問(wèn)指令——前索引寄存器偏移尋址編碼格式
內(nèi)存訪(fǎng)問(wèn)地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。當(dāng)指令的執(zhí)行條件<cc>滿(mǎn)足時(shí),生成地地址將寫(xiě)回基址寄存器。
(2)語(yǔ)法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<Rm>]
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量;
· !設(shè)置指令編碼中的W位,更新指令基址寄存器。
(3)操作偽代碼
If U = = 1 then
Address = Rn + Rm
Else
Address = Rn – Rm
If ConditionPassed{cond} then
Rn = address
(4)說(shuō)明
① 如果Rn和Rm指定為同一寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。
② 如果程序計(jì)數(shù)器r15被用作Rm或Rn,則指令的執(zhí)行結(jié)果不可預(yù)知。
5.[Rn],#±< offset_8>(1)編碼格式
指令的編碼格式如圖4.28所示。
圖4.28 雜項(xiàng)內(nèi)存訪(fǎng)問(wèn)指令——后索引立即數(shù)偏移尋址編碼格式
指令使用基址寄存器Rn的值作為實(shí)際內(nèi)存訪(fǎng)問(wèn)地址。當(dāng)指令的執(zhí)行條件滿(mǎn)足時(shí),將基址寄存器的值加/減偏移量生產(chǎn)新的地址值回寫(xiě)到Rn寄存器中。
(2)語(yǔ)法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>],±<offset_8>
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <offset_8>為8位立即數(shù),內(nèi)存訪(fǎng)問(wèn)地址偏移量。
(3)操作偽代碼
Address = Rn
Offset_8 = (immedH << 4) OR immedL
If conditionPassed{cond} then
If U = = 1 then
Rn = Rn + offset_8
Else
Rn = Rn – offset_8
(4)說(shuō)明
① 當(dāng)指令中沒(méi)有指定立即數(shù)時(shí),匯編器按“[<Rn>],#0”編碼。
② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。
6.[Rn],±<Rm>(1)編碼格式
指令的編碼格式如圖4.29所示。
圖4.29 雜項(xiàng)內(nèi)存訪(fǎng)問(wèn)指令——后索引寄存器偏移尋址編碼格式
指令訪(fǎng)問(wèn)地址為實(shí)際的基址寄存器的值。當(dāng)指令的執(zhí)行條件滿(mǎn)足時(shí),將基址寄存器的值加/減索引寄存器Rm的值回寫(xiě)到Rn基址寄存器。
(2)語(yǔ)法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[Rn],±<Rm>
其中:
· Rn為基址寄存器,該寄存器包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <Rm>為偏移地址寄存器,包含內(nèi)存訪(fǎng)問(wèn)地址偏移量。
(3)操作偽代碼
Address = Rn
If conditionPassed{cond} then
If U = = 1 then
Rn = Rn + Rm
Else
Rn = Rn – Rm
(4)說(shuō)明
① 程序寄存器r15被指定為Rm或Rn,指令的執(zhí)行結(jié)果不可預(yù)知。
② 如果Rm和Rn指定為同一寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。
4.2.3 批量Load/Store指令尋址方式批量Load/Store指令將一片連續(xù)內(nèi)存單元的數(shù)據(jù)加載到通用寄存器組中或?qū)⒁唤M通用寄存器的數(shù)據(jù)存儲(chǔ)到內(nèi)存單元中。
批量Load/Store指令的尋址模式產(chǎn)生一個(gè)內(nèi)存單元的地址范圍,指令寄存器和內(nèi)存單元的對(duì)應(yīng)關(guān)系滿(mǎn)足這樣的規(guī)則,即編號(hào)低的寄存器對(duì)應(yīng)于內(nèi)存中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于內(nèi)存中的高地址單元。
指令的語(yǔ)法格式如下。
LDM|STM{<cond>}<addressing_mode> <Rn>{!},<registers><^>
指令的尋址方式如表4.6所示。
表4.6 批量Load/Store指令的尋址方式
格 式
模 式
1
IA(Increment After)
后遞增方式
2
IB(Increment Before)
先遞增方式
3
DA(Decrement After)
后遞減方式
4
DB(Decrement Before)
先遞減方式
指令的編碼格式如圖4.30所示。
圖4.30 批量Load/Store指令編碼格式
編碼格式中各標(biāo)志位的含義如表4.7所示。
表4.7 批量Load/Store指令編碼格式各標(biāo)志位含義
位標(biāo)識(shí)
取 值
含 義
P
P=0
Rn包含的地址,是所要訪(fǎng)問(wèn)的內(nèi)存塊的高地址(U=0)還是低地址(U=1)
P=1
標(biāo)識(shí)Rn所指向的內(nèi)存單元是否被訪(fǎng)問(wèn)
U
U=0
Rn所指內(nèi)存單元為所要訪(fǎng)問(wèn)的內(nèi)存單元塊的高地址
U=1
Rn所指內(nèi)存單元為所要訪(fǎng)問(wèn)的內(nèi)存單元塊的低地址
S
S=0
當(dāng)程序計(jì)數(shù)器PC作為要加載的寄存器之一時(shí),S標(biāo)識(shí)是否將spsr內(nèi)容拷貝到cpsr;對(duì)于不加載PC的load指令和所有store指令,S標(biāo)識(shí)特權(quán)模式下,使用用戶(hù)模式寄存器組代替當(dāng)前模式下寄存器組
S=1
W
W=0
數(shù)據(jù)傳送完畢,更新地址寄存器內(nèi)容
W=1
L
L=0
Store指令
L=1
Load指令
1.IA尋址(1)編碼格式
指令的編碼格式如圖4.31所示。
該尋址方式指定一片連續(xù)的內(nèi)存地址空間,地址空間的大小<address_length>等于寄存器列表中寄存器數(shù)目的4倍。內(nèi)存地址范圍起始地址<start_address>等于基址寄存器Rn的值。結(jié)束地址<end_address>等于起始地址<start_address>加上地址空間大小<address_length>。
圖4.31 批量Load/Store指令——后增加尋址
地址空間中的每個(gè)內(nèi)存單元對(duì)應(yīng)寄存器列表中的一個(gè)寄存器。編號(hào)低的寄存器對(duì)應(yīng)于內(nèi)存中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于內(nèi)存中的高地址單元。
當(dāng)指令執(zhí)行條件滿(mǎn)足并且指令編碼格式中W位置位,基址寄存器Rn的值等于內(nèi)存地址范圍結(jié)束地址<end_address>加4。
(2)語(yǔ)法格式
LDM|STM{<cond>}IA <Rn>{!},<registers><^>
其中:
· IA標(biāo)識(shí)指令使用“后增加”尋址方式;
· Rn為基址寄存器,包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <registers>為指令操作的寄存器列表;
· <^>表示如果寄存器列表中包含程序計(jì)數(shù)器PC,是否將spsr拷貝到cpsr。
(3)操作偽代碼
Start_address = Rn
End_address = Rn + (Number_of_Set_Bits_In(register_list)*4) – 4
If conditionPassed(cond) and W = = 1 then
Rn = Rn + (Number_of_Set_Bits_In(register_list)*4)
2.DA尋址(1)編碼格式
指令的編碼格式如圖4.32所示。
圖4.32 批量Load/Store指令——后遞減尋址
該尋址方式指定一片連續(xù)的內(nèi)存地址空間,地址空間的大小<address_length>等于寄存器列表中寄存器數(shù)目的4倍。內(nèi)存地址范圍起始地址<start_address>等于基址寄存器Rn的值減去地址空間大小<address_length>并加4。結(jié)束地址<end_address>等于基址寄存器的值。
地址空間中的每個(gè)內(nèi)存單元對(duì)應(yīng)寄存器列表中的一個(gè)寄存器。編號(hào)低的寄存器對(duì)應(yīng)于內(nèi)存中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于內(nèi)存中的高地址單元。
當(dāng)指令執(zhí)行條件滿(mǎn)足并且指令編碼格式中W位置位時(shí),基址寄存器Rn的值等于內(nèi)存地址范圍起始地址<start_address>減4。
(2)語(yǔ)法格式
LDM|STM{<cond>}IA <Rn>{!},<registers><^>
其中:
· DA標(biāo)識(shí)指令使用“后遞減”尋址方式;
· Rn為基址寄存器,包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <registers>為指令操作的寄存器列表;
· <^>表示如果寄存器列表中包含程序計(jì)數(shù)器PC,是否將spsr拷貝到cpsr。
(3)操作偽代碼
Start_address = Rn – (Number_of_Set_Bits_In(register_list)*4) + 4
End_address = Rn
If conditionPassed(cond) and W = = 1 then
Rn = Rn - (Number_of_Set_Bits_In(register_list)*4)
3.IB尋址(1)編碼格式
指令的編碼格式如圖4.33所示。
圖4.33 批量Load/Store指令——前增加尋址
該尋址方式指定一片連續(xù)的內(nèi)存地址空間,地址空間的大小<address_length>等于寄存器列表中寄存器數(shù)目的4倍。內(nèi)存地址范圍起始地址<start_address>等于基址寄存器Rn的值加4。結(jié)束地址<end_address>等于起始地址<start_address>加上地址空間大小<address_length>。
地址空間中的每個(gè)內(nèi)存單元對(duì)應(yīng)寄存器列表中的一個(gè)寄存器。編號(hào)低的寄存器對(duì)應(yīng)于內(nèi)存中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于內(nèi)存中的高地址單元。
當(dāng)指令執(zhí)行條件滿(mǎn)足并且指令編碼格式中W位置位,基址寄存器Rn的值等于內(nèi)存地址范圍結(jié)束地址<end_address>。
(2)語(yǔ)法格式
LDM|STM{<cond>}IB <Rn>{!},<registers><^>
其中:
· IB標(biāo)識(shí)指令使用“前增加”尋址方式;
· Rn為基址寄存器,包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <registers>為指令操作的寄存器列表;
· <^>表示如果寄存器列表中包含程序計(jì)數(shù)器PC,是否將spsr拷貝到cpsr。
(3)操作偽代碼
Start_address = Rn + 4
End_address = Rn + (Number_of_Set_Bits_In(register_list)*4)
If ConditionPassed(cond) and W= = 1 then
Rn = Rn + (Number_Of_Set_Bits_In(register_list)*4)
4.DB尋址(1)編碼格式
指令的編碼格式如圖4.34所示。
圖4.34 批量Load/Store指令——前遞減尋址
該尋址方式指定一片連續(xù)的內(nèi)存地址空間,地址空間的大小<address_length>等于寄存器列表中寄存器數(shù)目的4倍。內(nèi)存地址范圍起始地址<start_address>等于基址寄存器Rn的值減地址空間的大小<address_length>。結(jié)束地址<end_address>等于基址寄存器的值減4。
地址空間中的每個(gè)內(nèi)存單元對(duì)應(yīng)寄存器列表中的一個(gè)寄存器。編號(hào)低的寄存器對(duì)應(yīng)于內(nèi)存中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于內(nèi)存中的高地址單元。
當(dāng)指令執(zhí)行條件滿(mǎn)足并且指令編碼格式中W位置位,基址寄存器Rn的值等于內(nèi)存地址范圍起始地址<address_address>。
(2)語(yǔ)法格式
LDM|STM{<cond>}DB <Rn>{!},<registers><^>
其中:
· DB標(biāo)識(shí)指令使用“前遞減”尋址方式;
· Rn為基址寄存器,包含內(nèi)存訪(fǎng)問(wèn)的基地址;
· <registers>為指令操作的寄存器列表;
· <^>表示如果寄存器列表中包含程序計(jì)數(shù)器PC,是否將spsr拷貝到cpsr。
(3)操作偽代碼
Start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)
End_address = Rn - 4
If ConditionPassed(cond) and W = = 1 then
Rn = Rn – (Number_Of_Set_Bits_In(register_list)*4)
4.2.4 堆棧操作尋址方式堆棧操作尋址方式和批量Load/Store指令尋址方式十分類(lèi)似。但對(duì)于堆棧的操作,數(shù)據(jù)寫(xiě)入內(nèi)存和從內(nèi)存中讀出要使用不同的尋址模式,因?yàn)檫M(jìn)棧操作(pop)和出棧操作(push)要在不同的方向上調(diào)整堆棧。
下面詳細(xì)討論如何使用合適的尋址方式實(shí)現(xiàn)數(shù)據(jù)的堆棧操作。
根據(jù)不同的尋址方式,將堆棧分為以下4種。
① Full棧:堆棧指針指向棧頂元素(last used location)。
② Empty棧:堆棧指針指向第一個(gè)可用元素(the first unused location)。
③ 遞減棧:堆棧向內(nèi)存地址減小的方向生長(zhǎng)。
④ 遞增棧:堆棧向內(nèi)存地址增加的方向生長(zhǎng)。
根據(jù)堆棧的不同種類(lèi),將其尋址方式分為以下4種。
① 滿(mǎn)遞減FD(Full Descending)。
② 空遞減ED(Empty Descending)。
③ 滿(mǎn)遞增FA(Full Ascending)。
④ 空遞增EA(Empty Ascending)。
注意
如果程序中有對(duì)協(xié)處理器數(shù)據(jù)的進(jìn)棧/出棧操作,最好使用FD或EA類(lèi)型堆棧。這樣可以使用一條STC或LDC指令將數(shù)據(jù)進(jìn)?;虺鰲?。