天天看點

【ARM】尋址方式

2.ARM指令尋址方式

  1. 資料處理指令的操作數的尋址方式。
  2. 字及無符号位元組的Load/Store指令的尋址方式。
  3. 雜類Load/Store指令的尋址方式。
  4. 批量Load/Store指令的尋址方式。
  5. 協處理器Load/Store指令的尋址方式。

通常資料處理指令的格式如下所示:

<opcode>{<cond>}{S} <Rd>,<Rn>,<shifter_operand>

其中:

<opcode> 是指令助記符,如ADD表示算術加操作指令。

{<cond>} 表示指令執行的條件。

{S} 決定指令的操作是否影響CPSR的值。

<Rd> 表示目标寄存器。

<Rn> 表示包含第1個操作數的寄存器。

<shifter_operand> 表示第2個操作數。

其有以下三種格式

    1. 立即數方式
    1. 寄存器方式
    1. 寄存器移位方式
- ASR 算術右移
- LSL 邏輯左移
- LSR 邏輯右移
- ROR 循環右移
- RRX 擴充的循環右移
           

2.2.1 資料處理指令的操作數的尋址方式

資料處理指令操作數的具體尋址方式有下面11種。

  1. #<immediate>
例:MOV R0,#0X10;将立即數0x10給R0
           
  1. <Rm>
例:MOV R0,R1;将R1的值放到R0
           
  1. <Rm>,LSL #<shift_imm>
例:MOV R0,R0,LSL #1;R0=R0*(2**1)
           
  1. <Rm>,LSL <Rs>
例:MOV R0,R0,LSL R1;R0=R0左移R1位後的值
           
  1. <Rm>,LSR #<shift_imm>
例:MOV R0,R0,LSL #1;R0=R0/(2**1)
           
  1. <Rm>,LS1R <Rs>
例:MOV R0,R0,LSL R1;R0=R0右移R1位後的值
           
  1. <Rm>,ASR #<shift_imm>
  2. <Rm>,ASR <Rs>
  3. <Rm>,ROR #<shift_imm>
  4. <Rm>,ROR <Rs>
  5. <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
           
  1. 寄存器+移位+事先通路
  • [<Rn>,+/–<Rm>,<shift>#<shift_imm>]!
LDR R0 [R0,R1,LSL #1];将記憶體單元R0+R1*(2**1)中的資料讀取到R0中,同時R0=R0+R1*(2**1)
           
  1. 立即數+事後通路
  • [<Rn>],#+/–<offset_12>
LDR R0,[R1],#4;将記憶體單元R1中的資料讀取到R0中,然後R0=R1+4
           
  1. 寄存器+事後通路
  • [<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指令的尋址方式

  1. 操作數為半字(無符号數或帶符号數)資料的Load/Store指令;
  2. 操作數為帶符号的位元組資料的Load 指令;雙字的Load/Store指令。

    這類指令的文法格式為: LDR|STR{<cond>}H|SH|SB|D <Rd>,<addressing_mode>

    其中,<addressing_mode>是指令中記憶體單元的尋址方式,具體有以下6種格式:

  1. 立即數+偏
  • [<Rn>,#+/–<offset_8>]
LDRSB R0,[R1,#4];将記憶體單元R1+4中的有符号位元組資料讀取到R0寄存器中;R0中高24位設定成該位元組資料的符号位
           
  1. 寄存器+偏
  • [<Rn>,+/–<Rm>]
STRH R0,[R1,R2];将R0中低16位資料儲存記憶體單元(R1+R2)中
           
  1. 寄存器+移位+事先通路
  • [<Rn>,#+/–<offset_8>]!
LDRSH R0,[R1,#4]!;将記憶體單元(R1+4)中位元組資料讀取到R0中;R0中高16位設定成該半位元組的符号位,同時R1=R1+4
           
  1. 寄存器+事先通路
  • [<Rn>,+/–<Rm>]!
LDRH R0,[R1,R2]!;将記憶體單元(R1+R2)中的半字資料讀取到R0中;R0中高16位設定成0,同時R0=R1+R2
           
  1. 寄存器+移位+事後
  • [<Rn>],#+/–<offset_8>
STRH R0,[R1],#4;将R0中低16位資料儲存到記憶體單元R1中,然後(指令執行完後)R0=R1+4
           
  1. 寄存器+事後
  • [<Rn>],+/–<Rm>
STRH R0,[R1],R2;将R0中低16位資料儲存到記憶體單元R1中,然後(指令執行完後)R1=R1+R2
           

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

2.2.5 協處理器Load/Store指令的尋址方式