www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]根據(jù)內(nèi)存訪問指令的分類,內(nèi)存訪問指令的尋址方式可以分為以下幾種。 ① 字及無符號字節(jié)的Load/Store指令的尋址方式。 ② 雜類Load/Store指令的尋址方式。 ③ 批量Load/Store指令的尋址方式。 ④ 協(xié)處理器Load/Store指令的尋址方式。

4.2 內(nèi)存訪問指令尋址

根據(jù)內(nèi)存訪問指令的分類,內(nèi)存訪問指令的尋址方式可以分為以下幾種。

① 字及無符號字節(jié)的Load/Store指令的尋址方式。

② 雜類Load/Store指令的尋址方式。

③ 批量Load/Store指令的尋址方式。

④ 協(xié)處理器Load/Store指令的尋址方式。

4.2.1 字及無符號字節(jié)的Load/Store指令的尋址方式

字及無符號字節(jié)的Load/Store指令語法格式如下:

LDR|STR{<cond>}{B}{T} <Rd>,<addressing_mode>

其中<addressing_mode>共有9種尋址方式,如表4.2所示。

表4.2 字及無符合字節(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)

字及無符號字節(jié)的Load/Store指令的解碼格式如圖4.13所示。

圖4.13 字及無符號字節(jié)的Load/Store指令的解碼格式

編碼格式中各位的含義如表4.3所示。

表4.3 字和無符號半字Load/Store指令編碼格式各位含義

位 標(biāo) 識

取 值

含 義

P

P=0

使用后索引尋址

P=1

使用偏移地址或前索引尋址(由W位決定)

U

U=0

訪問的地址=基址寄存器的值-偏移量(offset)

U=1

訪問的地址=基址寄存器的值+偏移量(offset)

B

B=0

字訪問Load/Store

B=1

無符號字節(jié)訪問Load/Store

W

W=0

如果P=0,該指令為LDR、LDRB、STR或STRB指令,且內(nèi)存訪問指令為正常訪問指令;如果P=1,指令執(zhí)行不更新基地址

W=1

如果P=0,該指令為LDRBT、LDRT、STRBT或STRT,且指令為非特權(quán)(用戶模式)訪問指令;如果P=1,計(jì)算內(nèi)存地址并更新基地址

L

L=0

Store指令

L=1

Load指令

1.[Rn,#±<offset_12>]

(1)編碼格式

指令的編碼格式如圖4.14所示。

圖4.14 內(nèi)存訪問指令——立即數(shù)偏移尋址編碼格式

內(nèi)存訪問地址為基址寄存器Rn的值加(或減)立即數(shù)offset_12。

編程中,在訪問結(jié)構(gòu)體或記錄(record)類型的變量時(shí),這些內(nèi)存的操作指令是十分有效的。另外,在子程序中也常用這些指令訪問本地變量和堆棧。

(2)語法格式

LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,#±<offset_12>]

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <offset_12>為12位立即數(shù),內(nèi)存訪問地址偏移量。

(3)操作偽代碼

If U = = 1 then

Address = Rn + offset_12

Else

Address = Rn – offset_12

(4)說明

① 如果指令中沒有指定立即數(shù),使用[<Rn>],編譯器按[<Rn>,#0]形式編碼。

② 如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8。

2.[Rn,±Rm]

(1)編碼格式

指令的編碼格式如圖4.15所示。

圖4.15 內(nèi)存訪問指令——寄存器偏移尋址編碼格式

內(nèi)存訪問地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。

該尋址方式適合使用指針訪問字節(jié)數(shù)組中的數(shù)據(jù)成員。

(2)語法格式

LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>]

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量。

(3)操作偽代碼

If U = = 1 then

Address = Rn + Rm

Else

Address = Rn – Rm

(4)說明

如果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)存訪問指令——帶移位的寄存器偏移尋址編碼格式

內(nèi)存地址為Rn的值加/減通過移位操作后的Rm的值。

當(dāng)數(shù)組中的成員長度大于1個(gè)字節(jié)時(shí),使用該尋址方式可高效率地訪問數(shù)組成員。

(2)語法格式

語法格式有以下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)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量;

· 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)說明

如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的執(zhí)行結(jié)果不可預(yù)知。

4.[Rn,#±< offset_12>]!

(1)編碼格式

指令的編碼格式如圖4.17所示。

圖4.17 內(nèi)存訪問指令——前索引立即數(shù)偏移尋址編碼格式

內(nèi)存地址為基址寄存器Rn加/減立即數(shù)offset_8的值。當(dāng)指令執(zhí)行的條件<cc>滿足時(shí),生成的地址寫回基址寄存器Rn中。

該尋址方式適合訪問數(shù)組自動(dòng)進(jìn)行數(shù)組下標(biāo)的更新。

(2)語法格式

LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<offset_12>] !

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <offset_12>為12位立即數(shù),內(nèi)存訪問地址偏移量;

· !設(shè)置指令編碼中的W位,更新指令基址寄存器。

(3)操作偽代碼

If U == 1 then

Address = Rn + offset_12

Else

Address = Rn – offset_12

If ConditionPassed{cond} then

Rn = address

(4)說明

① 如果指令中沒有指定立即數(shù),使用[<Rn>],編譯器按[<Rn>,#0] ! 形式編碼。

② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。

5.[Rn,±Rm]!

(1)編碼格式

指令的編碼格式如圖4.18所示。

圖4.18 內(nèi)存訪問指令——前索引寄存器偏移尋址編碼格式

內(nèi)存訪問地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。當(dāng)指令的執(zhí)行條件<cc>滿足時(shí),生成地地址將寫回基址寄存器。

(2)語法格式

LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,±<Rm>]

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量;

· !設(shè)置指令編碼中的W位,更新指令基址寄存器。

(3)操作偽代碼

If U = = 1 then

Address = Rn + Rm

Else

Address = Rn – Rm

If ConditionPassed{cond} then

Rn = address

(4)說明

如果Rn和Rm指定為同一寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。

6.[Rn,±Rm,<shift>#< offset_12>]!

(1)編碼格式

指令的編碼格式如圖4.19所示。

圖4.19 內(nèi)存訪問指令——帶移位的前索引寄存器偏移尋址編碼格式

內(nèi)存地址為Rn的值加/減通過移位操作后的Rm的值。當(dāng)指令的執(zhí)行條件<cc>滿足時(shí),生成地地址將寫回基址寄存器。

(2)語法格式

語法格式有以下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)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量;

· 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)說明

① 當(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)存訪問指令——后索引立即數(shù)偏移尋址編碼格式

指令使用基址寄存器Rn的值作為實(shí)際內(nèi)存訪問地址。當(dāng)指令的執(zhí)行條件滿足時(shí),將基址寄存器的值加/減偏移量產(chǎn)生新的地址值回寫到Rn寄存器中。

(2)語法格式

LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>],±<offset_12>

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <offset_12>為12位立即數(shù),內(nèi)存訪問地址偏移量。

(3)操作偽代碼

Address = Rn

If conditionPassed{cond} then

If U = = 1 then

Rn = Rn + offset_12

Else

Rn = Rn – offset_12

(4)說明

① LDRBT、LDRT、STRBT和STRT指令只支持后索引尋址。

② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。

8.[Rn],±<Rm>

(1)編碼格式

指令的編碼格式如圖4.21所示。

圖4.21 內(nèi)存訪問指令——后索引寄存器偏移尋址編碼格式

指令訪問地址為實(shí)際的基址寄存器的值。當(dāng)指令的執(zhí)行條件滿足時(shí),將基址寄存器的值加/減索引寄存器Rm的值回寫到Rn基址寄存器。

(2)語法格式

LDR|STR{<cond>}{B}{T} <Rd>,[Rn],±<Rm>

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量。

(3)操作偽代碼

Address = Rn

If conditionPassed{cond} then

If U = = 1 then

Rn = Rn + Rm

Else

Rn = Rn – Rm

(4)說明

① LDRBT、LDRT、STRBT和STRT指令只支持后索引尋址。

② 如果Rm和Rn指定為同一寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。

9.[Rn],±Rm,<shift>#< offset_12>]

(1)編碼格式

指令的編碼格式如圖4.22所示。

圖4.22 內(nèi)存訪問指令——帶移位的后索引寄存器偏移尋址編碼格式

實(shí)際的內(nèi)存訪問地址為寄存器Rn的值。當(dāng)指令的執(zhí)行條件滿足時(shí),將基址寄存器值加/減一個(gè)地址偏移量產(chǎn)生新的地址值。

(2)語法格式

語法格式有以下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)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量;

· 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)說明

① 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 雜類Load/Store指令的尋址方式

使用該類尋址方式的指令的語法格式如下。

LDR|STR{<cond>}H|SH|SB|D <Rd>,<addressing_mode>

使用該類尋址方式的指令包括:(有符號/無符號)半字Load/Store指令、有符號字節(jié)Load/Store指令和雙字Load/Store指令。

該類尋址方式分為6種類型,如表4.4所示。

表4.4 雜類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)

雜類Load/Store指令的解碼格式如圖4.23所示。

圖4.23 雜類Load/Store指令解碼格式

編碼格式中各標(biāo)志位的含義如表4.5所示。

表4.5 雜類Load/Store指令編碼格式各標(biāo)志位含義

位 標(biāo) 識

取 值

含 義

P

P=0

使用后索引尋址

P=1

使用偏移地址或前索引尋址(由W位決定)

續(xù)表

位 標(biāo) 識

取 值

含 義

U

U=0

訪問的地址=基址寄存器的值-偏移量(offset)

U=1

訪問的地址=基址寄存器的值+偏移量(offset)

W

W=0

如果P=0,使用后索引尋址;P=1,指令不改變基址寄存器的值

W=1

如果P=0,未定義指令;如果P=1,將計(jì)算的內(nèi)存訪問地址回寫到基址寄存器

L

L=0

Store指令

L=1

Load指令

S

S=0

無符號半字內(nèi)存訪問

S=1

有符號半字內(nèi)存訪問

H

H=0

字節(jié)訪問

H=1

半字訪問

注意

當(dāng)S=0并且H=0時(shí),并非無符號的字節(jié)內(nèi)存訪問指令。無符號的內(nèi)存訪問指令不使用該種尋址方式,詳見本章上一節(jié)。

當(dāng)S=1并且L=0時(shí),并非是有符號的存儲(chǔ)指令,而是未定義指令。ARM指令并未區(qū)分有符號和無符號的字節(jié)和半字存儲(chǔ)。

1.[Rn,#±<offset_8>]

(1)編碼格式

指令的編碼格式如圖4.24所示。

圖4.24 雜項(xiàng)內(nèi)存訪問指令——立即數(shù)偏移尋址編碼格式

內(nèi)存訪問地址為基址寄存器Rn的值加(或減)立即數(shù)offset_8。

編程中,在訪問結(jié)構(gòu)體或記錄(record)類型的變量時(shí),這些內(nèi)存的操作指令是十分有效的。另外,在子程序中,也常用這些指令訪問本地變量和堆棧。當(dāng)offset_8=0時(shí),內(nèi)存訪問地址即基址寄存器Rn的值。

(2)語法格式

LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,#±<offset_12>]

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址。

· <offset_8>為8位立即數(shù),內(nèi)存訪問地址偏移量。

(3)操作偽代碼

offset_8 = (immedH << 4) OR immedL

If U = = 1 then

Address = Rn + offset_8

Else

Address = Rn – offset_8

(4)說明

① 如果指令中沒有指定立即數(shù),使用[<Rn>],編譯器按[<Rn>,#0]形式編碼。

② 如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8。

2.[Rn,±Rm]

(1)編碼格式

指令的編碼格式如圖4.25所示。

圖4.25 雜項(xiàng)內(nèi)存訪問指令——寄存器偏移尋址編碼格式

內(nèi)存訪問地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。

該尋址方式適合使用指針訪問數(shù)組中的單個(gè)數(shù)據(jù)成員。

(2)語法格式

LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<Rm>]

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量。

(3)操作偽代碼

If U = = 1 then

Address = Rn + Rm

Else

Address = Rn – Rm

(4)說明

如果Rn被指定為程序計(jì)數(shù)器r15,其值為當(dāng)前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的執(zhí)行結(jié)果不可預(yù)知。

3.[Rn,#±< offset_8>]!

(1)編碼格式

指令的編碼格式如圖4.26所示。

圖4.26 雜類內(nèi)存訪問指令——前索引立即數(shù)偏移尋址編碼格式

內(nèi)存地址為基址寄存器Rn加/減立即數(shù)offset_8的值。當(dāng)指令執(zhí)行的條件<cc>滿足時(shí),生成的地址寫回基址寄存器Rn中。

該尋址方式適合訪問數(shù)組自動(dòng)進(jìn)行數(shù)組下標(biāo)的更新。

(2)語法格式

LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<offset_8>] !

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <offset_8>為8位立即數(shù),內(nèi)存訪問地址偏移量,在指令編碼格式中被拆為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)說明

① 如果指令中沒有指定立即數(shù),使用[<Rn>],編譯器按[<Rn>,#0] ! 形式編碼。

② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。

4.[Rn,±Rm] !

(1)編碼格式

指令的編碼格式如圖4.27所示。

圖4.27 雜項(xiàng)內(nèi)存訪問指令——前索引寄存器偏移尋址編碼格式

內(nèi)存訪問地址為基址寄存器Rn的值加(或減)偏移寄存器Rm的值。當(dāng)指令的執(zhí)行條件<cc>滿足時(shí),生成地地址將寫回基址寄存器。

(2)語法格式

LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<Rm>]

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量;

· !設(shè)置指令編碼中的W位,更新指令基址寄存器。

(3)操作偽代碼

If U = = 1 then

Address = Rn + Rm

Else

Address = Rn – Rm

If ConditionPassed{cond} then

Rn = address

(4)說明

① 如果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)存訪問指令——后索引立即數(shù)偏移尋址編碼格式

指令使用基址寄存器Rn的值作為實(shí)際內(nèi)存訪問地址。當(dāng)指令的執(zhí)行條件滿足時(shí),將基址寄存器的值加/減偏移量生產(chǎn)新的地址值回寫到Rn寄存器中。

(2)語法格式

LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>],±<offset_8>

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <offset_8>為8位立即數(shù),內(nèi)存訪問地址偏移量。

(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)說明

① 當(dāng)指令中沒有指定立即數(shù)時(shí),匯編器按“[<Rn>],#0”編碼。

② 如果Rn被指定為程序計(jì)數(shù)器r15,指令的執(zhí)行結(jié)果不可預(yù)知。

6.[Rn],±<Rm>

(1)編碼格式

指令的編碼格式如圖4.29所示。

圖4.29 雜項(xiàng)內(nèi)存訪問指令——后索引寄存器偏移尋址編碼格式

指令訪問地址為實(shí)際的基址寄存器的值。當(dāng)指令的執(zhí)行條件滿足時(shí),將基址寄存器的值加/減索引寄存器Rm的值回寫到Rn基址寄存器。

(2)語法格式

LDR|STR{<cond>}H|SH|SB|D <Rd>,[Rn],±<Rm>

其中:

· Rn為基址寄存器,該寄存器包含內(nèi)存訪問的基地址;

· <Rm>為偏移地址寄存器,包含內(nèi)存訪問地址偏移量。

(3)操作偽代碼

Address = Rn

If conditionPassed{cond} then

If U = = 1 then

Rn = Rn + Rm

Else

Rn = Rn – Rm

(4)說明

① 程序寄存器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)存單元的對應(yīng)關(guān)系滿足這樣的規(guī)則,即編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中的高地址單元。

指令的語法格式如下。

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)識

取 值

含 義

P

P=0

Rn包含的地址,是所要訪問的內(nèi)存塊的高地址(U=0)還是低地址(U=1)

P=1

標(biāo)識Rn所指向的內(nèi)存單元是否被訪問

U

U=0

Rn所指內(nèi)存單元為所要訪問的內(nèi)存單元塊的高地址

U=1

Rn所指內(nèi)存單元為所要訪問的內(nèi)存單元塊的低地址

S

S=0

當(dāng)程序計(jì)數(shù)器PC作為要加載的寄存器之一時(shí),S標(biāo)識是否將spsr內(nèi)容拷貝到cpsr;對于不加載PC的load指令和所有store指令,S標(biāo)識特權(quán)模式下,使用用戶模式寄存器組代替當(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)存單元對應(yīng)寄存器列表中的一個(gè)寄存器。編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中的高地址單元。

當(dāng)指令執(zhí)行條件滿足并且指令編碼格式中W位置位,基址寄存器Rn的值等于內(nèi)存地址范圍結(jié)束地址<end_address>加4。

(2)語法格式

LDM|STM{<cond>}IA <Rn>{!},<registers><^>

其中:

· IA標(biāo)識指令使用“后增加”尋址方式;

· Rn為基址寄存器,包含內(nèi)存訪問的基地址;

· <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)存單元對應(yīng)寄存器列表中的一個(gè)寄存器。編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中的高地址單元。

當(dāng)指令執(zhí)行條件滿足并且指令編碼格式中W位置位時(shí),基址寄存器Rn的值等于內(nèi)存地址范圍起始地址<start_address>減4。

(2)語法格式

LDM|STM{<cond>}IA <Rn>{!},<registers><^>

其中:

· DA標(biāo)識指令使用“后遞減”尋址方式;

· Rn為基址寄存器,包含內(nèi)存訪問的基地址;

· <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)存單元對應(yīng)寄存器列表中的一個(gè)寄存器。編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中的高地址單元。

當(dāng)指令執(zhí)行條件滿足并且指令編碼格式中W位置位,基址寄存器Rn的值等于內(nèi)存地址范圍結(jié)束地址<end_address>。

(2)語法格式

LDM|STM{<cond>}IB <Rn>{!},<registers><^>

其中:

· IB標(biāo)識指令使用“前增加”尋址方式;

· Rn為基址寄存器,包含內(nèi)存訪問的基地址;

· <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)存單元對應(yīng)寄存器列表中的一個(gè)寄存器。編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中的高地址單元。

當(dāng)指令執(zhí)行條件滿足并且指令編碼格式中W位置位,基址寄存器Rn的值等于內(nèi)存地址范圍起始地址<address_address>。

(2)語法格式

LDM|STM{<cond>}DB <Rn>{!},<registers><^>

其中:

· DB標(biāo)識指令使用“前遞減”尋址方式;

· Rn為基址寄存器,包含內(nèi)存訪問的基地址;

· <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指令尋址方式十分類似。但對于堆棧的操作,數(shù)據(jù)寫入內(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)存地址減小的方向生長。

④ 遞增棧:堆棧向內(nèi)存地址增加的方向生長。

根據(jù)堆棧的不同種類,將其尋址方式分為以下4種。

① 滿遞減FD(Full Descending)。

② 空遞減ED(Empty Descending)。

③ 滿遞增FA(Full Ascending)。

④ 空遞增EA(Empty Ascending)。

注意

如果程序中有對協(xié)處理器數(shù)據(jù)的進(jìn)棧/出棧操作,最好使用FD或EA類型堆棧。這樣可以使用一條STC或LDC指令將數(shù)據(jù)進(jìn)?;虺鰲?。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉