2.ARM指令尋址方式
- 資料處理指令的操作數的尋址方式。
- 字及無符号位元組的Load/Store指令的尋址方式。
- 雜類Load/Store指令的尋址方式。
- 批量Load/Store指令的尋址方式。
- 協處理器Load/Store指令的尋址方式。
通常資料處理指令的格式如下所示:
<opcode>{<cond>}{S} <Rd>,<Rn>,<shifter_operand>
其中:
<opcode> 是指令助記符,如ADD表示算術加操作指令。
{<cond>} 表示指令執行的條件。
{S} 決定指令的操作是否影響CPSR的值。
<Rd> 表示目标寄存器。
<Rn> 表示包含第1個操作數的寄存器。
<shifter_operand> 表示第2個操作數。
其有以下三種格式
-
- 立即數方式
-
- 寄存器方式
-
- 寄存器移位方式
- ASR 算術右移
- LSL 邏輯左移
- LSR 邏輯右移
- ROR 循環右移
- RRX 擴充的循環右移
2.2.1 資料處理指令的操作數的尋址方式
資料處理指令操作數的具體尋址方式有下面11種。
- #<immediate>
例:MOV R0,#0X10;将立即數0x10給R0
- <Rm>
例:MOV R0,R1;将R1的值放到R0
- <Rm>,LSL #<shift_imm>
例:MOV R0,R0,LSL #1;R0=R0*(2**1)
- <Rm>,LSL <Rs>
例:MOV R0,R0,LSL R1;R0=R0左移R1位後的值
- <Rm>,LSR #<shift_imm>
例:MOV R0,R0,LSL #1;R0=R0/(2**1)
- <Rm>,LS1R <Rs>
例:MOV R0,R0,LSL R1;R0=R0右移R1位後的值
- <Rm>,ASR #<shift_imm>
- <Rm>,ASR <Rs>
- <Rm>,ROR #<shift_imm>
- <Rm>,ROR <Rs>
- <Rm>,RRX
2.2.2 字及無符号位元組的Load/Store指令的 尋址方式
種類型的Load/Store指令的尋址方式由兩部分組成。
一部分為一個的基址寄存器;另一部分為一個位址偏移量。
基址寄存器可以為任一個通用寄存器;
位址偏移量可以有以下3種格式。立即數 寄存器 寄存器及一個移位常數
同樣,尋址方式的位址計算方法有如下3種:偏移量方法 事先更新方法 事後更新方法
LDR指令的文法格式如下所示:
LDR{<cond>}{B} {T}<Rd>,<address_mode> 其中,<address_mode>表示第2個操作數的記憶體位址,共有如下9種格式:
1.立即數+偏
- [<Rn>,#+/–<offset_12>]
例:LDR R0,[R0,#4];将記憶體單元R0+4中的字讀取到R0中
2.寄存器+偏
- [<Rn>,+/–<Rm>]
例:LDR R0,[R0,R1];将記憶體單元R0+R1中的字讀取到R0中
3.寄存器+移位+偏
- [<Rn>,+/–<Rm>,<shift>#<shift_imm>]
LDR R0 [R0,R1,LSL #1];将記憶體單元R0+R1*(2**1)中的資料讀取到R0中
4.立即數+偏+事先通路
- [<Rn>,#+/–<offset_12>]!
例:LDR R0,[R0,#4];将記憶體單元R0+4中的字讀取到R0中,同時R0=R0+4
5.寄存器+偏+事先通路
- [<Rn>,+/–<Rm>]!
例:LDR R0,[R0,R1];将記憶體單元R0+R1中的字讀取到R0中,同時R0=R0+R1
- 寄存器+移位+事先通路
- [<Rn>,+/–<Rm>,<shift>#<shift_imm>]!
LDR R0 [R0,R1,LSL #1];将記憶體單元R0+R1*(2**1)中的資料讀取到R0中,同時R0=R0+R1*(2**1)
- 立即數+事後通路
- [<Rn>],#+/–<offset_12>
LDR R0,[R1],#4;将記憶體單元R1中的資料讀取到R0中,然後R0=R1+4
- 寄存器+事後通路
- [<Rn>],+/–<Rm>
LDR R0,[R1],R2;将記憶體單元R1中的資料讀取到R0中,然後R0=R1+R2
9.寄存器+移位+事先通路
- [<Rn>],+/–<Rm>,<shift>#<shift_imm>
LDR R0,[R1],R2,LSL #2;将記憶體單元R1中的資料讀取到R0中,然後R0=R1+R2*(2**2)
2.2.3 雜類Load/Store指令的尋址方式
- 操作數為半字(無符号數或帶符号數)資料的Load/Store指令;
操作數為帶符号的位元組資料的Load 指令;雙字的Load/Store指令。
這類指令的文法格式為: LDR|STR{<cond>}H|SH|SB|D <Rd>,<addressing_mode>
其中,<addressing_mode>是指令中記憶體單元的尋址方式,具體有以下6種格式:
- 立即數+偏
- [<Rn>,#+/–<offset_8>]
LDRSB R0,[R1,#4];将記憶體單元R1+4中的有符号位元組資料讀取到R0寄存器中;R0中高24位設定成該位元組資料的符号位
- 寄存器+偏
- [<Rn>,+/–<Rm>]
STRH R0,[R1,R2];将R0中低16位資料儲存記憶體單元(R1+R2)中
- 寄存器+移位+事先通路
- [<Rn>,#+/–<offset_8>]!
LDRSH R0,[R1,#4]!;将記憶體單元(R1+4)中位元組資料讀取到R0中;R0中高16位設定成該半位元組的符号位,同時R1=R1+4
- 寄存器+事先通路
- [<Rn>,+/–<Rm>]!
LDRH R0,[R1,R2]!;将記憶體單元(R1+R2)中的半字資料讀取到R0中;R0中高16位設定成0,同時R0=R1+R2
- 寄存器+移位+事後
- [<Rn>],#+/–<offset_8>
STRH R0,[R1],#4;将R0中低16位資料儲存到記憶體單元R1中,然後(指令執行完後)R0=R1+4
- 寄存器+事後
- [<Rn>],+/–<Rm>
STRH R0,[R1],R2;将R0中低16位資料儲存到記憶體單元R1中,然後(指令執行完後)R1=R1+R2