ARM存储器访问指令 1.LDR和STR一字和无符号字节 LDR:加载寄存器 STR:存储寄存器 字节加载用0扩展到32位。 句法: 1.op {cond){B}{T}Rd,[Rn] ;零偏移 2.op{cond{B}Rd,[Rn,Flexoffset];前索引偏移 3.op {cond){B)Rd,label ;程序相对偏移 4.op{cond{B}{T}Rd,[Rn],Flexoffset;后索引偏移 T:即使在特权模式下,存储系统也将访问看成是处理器是在用户模式下。 Label::程序相对偏移表达式。必须是在当前指令的士4KB范围内。 !:若Rn是R15,则不能使用后缀“!
ARM存储器访问指令 1. LDR和STR——字和无符号字节 • LDR:加载寄存器 • STR:存储寄存器 • 字节加载用0扩展到32位。 • 句法: 1. op {cond} {B} {T} Rd,[Rn] ;零偏移 2. op {cond} {B} Rd,[Rn,Flexoffset] {!} ;前索引偏移 3. op {cond} {B} Rd,label ;程序相对偏移 4. op {cond} {B} {T} Rd,[Rn],Flexoffset;后索引偏移 T:即使在特权模式下,存储系统也将访问看成是处理器是在用户模式下。 Label:程序相对偏移表达式。必须是在当前指令的±4KB范围内。 !:若Rn是R15,则不能使用后缀“!
LDR和STR一字和无符号字节 ·Flexoffset句法: 前索引和后索引可以是以下2种形式之一: ·#eXpr ·{-}Rm{,shift) 其中: -:可选的负号。若带负号,则从R中减去偏移量。 expr:表达式,取值范围:-4096+4096,经常取常量。 Rm:内含偏移量的寄存器。Rm不允许为R15。 shit:Rm的可选移位方法。可以是移位寻址的6种方法之一 大多数情况下,必须保证用于32位传送的地址是32位对准 的。将指定的地址取成4的倍数。 ·通常应尽量避免从R15中存储
• Flexoffset句法: 前索引和后索引可以是以下2种形式之一: • #expr • {-} Rm {,shift} 其中: -:可选的负号。若带负号,则从Rn中减去偏移量。 expr:表达式,取值范围:-4096~+4096,经常取常量。 Rm:内含偏移量的寄存器。Rm不允许为R15。 shift:Rm的可选移位方法。可以是移位寻址的6种方法之一 • 大多数情况下,必须保证用于32位传送的地址是32位对准 的。将指定的地址取成4的倍数。 • 通常应尽量避免从R15中存储。 LDR和STR——字和无符号字节
LDR和STR一字和无符号字节 ·例子: LDR R8,[R10] >LDRNE R2,[R5,#960]! >STR R2,[R9,#consta-struc] >STRB R0,[R3,-R8,ASR#2] >STR R5,[R7],#-8 >LDR RO,localdata
• 例子: ¾ LDR R8,[R10] ¾ LDRNE R2,[R5,#960]! ¾ STR R2,[R9,#consta-struc] ¾ STRB R0,[R3,-R8,ASR #2] ¾ STR R5,[R7],#-8 ¾ LDR R0,localdata LDR和STR——字和无符号字节
2.LDR和STR一半字和带符号字节 加载寄存器、带符号的8位字节、带符号和无符号的 16位半字。存储寄存器、16位半字。 带符号的加载是指带符号扩展到32位。无符号的半字 加载是指零扩展到32位。 句法: 1.op {cond}type Rd,[Rn] 2.op {cond}type Rd,[Rn,offset]{ 3.op {cond}type Rd,label 4.op {cond)type Rd,[Rn],offset type:必须是以下所列之一: SH:对带符号半字(仅LDR) H:对无符号半字 SB:对带符号字节(仅LDR) label:程序相对偏移表达式。必须在当前指令的士255字节内。 offset:加在Rn上的偏移量
2. LDR和STR——半字和带符号字节 • 加载寄存器、带符号的8位字节、带符号和无符号的 16位半字。存储寄存器、16位半字。 • 带符号的加载是指带符号扩展到32位。无符号的半字 加载是指零扩展到32位。 • 句法: 1. op {cond} type Rd,[Rn] 2. op {cond} type Rd,[Rn,offset] {!} 3. op {cond} type Rd,label 4. op {cond} type Rd,[Rn],offset type:必须是以下所列之一: SH:对带符号半字(仅LDR) H:对无符号半字 SB:对带符号字节(仅LDR) label:程序相对偏移表达式。必须在当前指令的±255字节内。 offset:加在Rn上的偏移量
LDR和STR一半字和带符号字节 offset句法: 前索引和后索引可以是以下2种形式之一: ·#eXpr ·{-}Rm expr是表达式,其值在±255范围内的整数,经常是数字常量。 ·半字节传送的地址必须是偶数。 ·不能将半字或字节加载到R15。 ·例子: LDREQSH R11,[R6] LDRH R1,[R0,#22] STRH R4,[R0,R1]! LDRSB R6,constf LDRSB R1,[R6],R3,LSL#4;X
• offset句法: 前索引和后索引可以是以下2种形式之一: • #expr • {-} Rm expr是表达式,其值在±255范围内的整数,经常是数字常量。 • 半字节传送的地址必须是偶数。 • 不能将半字或字节加载到R15。 • 例子: LDREQSH R11,[R6] LDRH R1,[R0,#22] STRH R4,[R0,R1]! LDRSB R6,constf LDRSB R1,[R6],R3,LSL #4;× LDR和STR——半字和带符号字节