ARM指令寻址方式之: 内存访问指令寻址
1.[Rn,#±offset_12>]
(1)编码格式
指令的编码格式如图4.14所示。
图4.14 内存访问指令——立即数偏移寻址编码格式
内存访问地址为基址寄存器Rn的值加(或减)立即数offset_12。
编程中,在访问结构体或记录(record)类型的变量时,这些内存的操作指令是十分有效的。另外,在子程序中也常用这些指令访问本地变量和堆栈。
(2)语法格式
LDR|STR{cond>}{B}{T} Rd>,[Rn>,#±offset_12>]
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址;
· offset_12>为12位立即数,内存访问地址偏移量。
(3)操作伪代码
If U = = 1 then
Address = Rn + offset_12
Else
Address = Rn – offset_12
(4)说明
① 如果指令中没有指定立即数,使用[Rn>],编译器按[Rn>,#0]形式编码。
② 如果Rn被指定为程序计数器r15,其值为当前指令地址加8。
2.[Rn,±Rm]
(1)编码格式
指令的编码格式如图4.15所示。
图4.15 内存访问指令——寄存器偏移寻址编码格式
内存访问地址为基址寄存器Rn的值加(或减)偏移寄存器Rm的值。
该寻址方式适合使用指针访问字节数组中的数据成员。
(2)语法格式
LDR|STR{cond>}{B}{T} Rd>,[Rn>,±Rm>]
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址;
· Rm>为偏移地址寄存器,包含内存访问地址偏移量。
(3)操作伪代码
If U = = 1 then
Address = Rn + Rm
Else
Address = Rn – Rm
(4)说明
如果Rn被指定为程序计数器r15,其值为当前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的执行结果不可预知。
3.[Rn,Rm,shift># offset_12>]
(1)编码格式
指令的编码格式如图4.16所示。
图4.16 内存访问指令——带移位的寄存器偏移寻址编码格式
内存地址为Rn的值加/减通过移位操作后的Rm的值。
当数组中的成员长度大于1个字节时,使用该寻址方式可高效率地访问数组成员。
评论