全部博文(96)
分类:
2012-11-22 15:28:20
指令格式:
LDR/STR{cond}{T} Rd,<地址>
LDR/STR{cond}B{T} Rd,<地址>
指令LDR{cond}{T} Rd,<地址>,加载指定地址的字数据到Rd中;指令STR{cond}{T}
Rd,<地址>,存储Rd中的字数据到指定的地址单元中。LDR{cond}B{T} Rd,<地址>指令
加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);STR{cond}B{T} Rd,
<地址>指令存储Rd中的最低字节数据到指定的地址单元中。T为可选后缀,若有T,那么即
使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式
下无效,不能与前索引偏移一起使用T。地址部分可用的形式有4种:
零偏移(zero offset) [Rn],Rn 的值作为传送数据的地址。如:
LDR R0,[R1];
前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量 Flexoffset
加到 Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到 Rn 中,
且 Rn 不允许是 R15,如:
LDRB R0,[R1,#8] ; *r0=*(r1+8)将r1地址+8后的数据传给r0
LDR R0,[R1,#8]! ; *r0=*(r1+8); *r1 = *r0将r1地址+8后的数据传给r0,并返回给r1
程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。
程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成
前索引指令,不能使用后缀“!”,如:
LDR R0,place
;place 地址装入 R0
后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量 Flexoffset
加到 Rn 中,结果写回到 Rn,Rn 不允许是 R15,如:
LDR R0,[R1],R2,LSL#2
;将存储器地址为 R1 的字数据读入寄存器 R0,并将
新地址 R1+R2×4 写入 R1。
R0=R1+R2×4
用于字和无符号字节的存取指令, 偏移量Flexoffset可以是下两种形式之:
1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:
STR R5,[R7],#--8
2)一个寄存器再加上移位(移位由立即数指定),如:{-}Rm{,shift}
其中:
- :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。
Rm :内含偏移量的寄存器。Rm 不允许是R15。
Shift:Rm 的可选移位方法。可以是下列形式的任何一种:
ASR n :算术右移n 位(1<=n<=32)
LSL n :逻辑左移n 位(1<=n<=31)
LSR n :逻辑右移n 位(1<=n<=32)
ROR n :循环右移n 位(1<=n<=31)
RRX
:循环右移1 位,带扩展。
AND―――――逻辑"与"操作指令
指令格式:
AND{cond}{S} Rd,Rn,operand2
AND指令将操作数 operand2 与 Rn 的值按位逻辑"与",结果存放到目的寄存器 Rd
中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V
位(指令 ORR、EOR、BIC 对标志位的影响同 AND 指令)。
指令示例:
ANDS R1,R1,R2
AND R0,R0,#0x0F
;R1=R1&R2,并根据运算的结果更新标志位
;R0=R0&0x0F,取出 R0 最低4位数据。
ORR―――――逻辑"或"操作指令
指令格式:
ORR{cond}{S} Rd,Rn,operand2
ORR指令将操作数 operand2 与 Rn 的值按位逻辑"或",结果存放到目的寄存器 Rd
中。
指令示例:
ORRS R1,R1,R2
ORR R0,R0,#0x0F
;R1=R1|R2,并根据运算的结果更新标志位
;R0=R0|0x0F,将R0最低4位置1,其余位不变。
BIC―――――位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令将 Rn 的值与操作数 operand2 的反码按位逻辑"与",结果存放到目的寄存
器 Rd 中。
指令示例:
BIC
R0,R0,#0x0F
;将R0最低4位清零,其余位不变。
CMP―――――比较指令
指令格式:
CMP{cond} Rn,operand2
CMP指令用 Rn 的值减去操作数 operand2,并将结果的状态(Rn 与 operand2 比
较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。
CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。
指令示例:
cmp R0,R1
beq stop
blt less
;比较 R0,R1
;R0=R1 跳到 stop
;R0
.
.
.
Less:
.
.
.
Stop:
SUB―――――减法运算指令
指令格式:
SUB{cond}{S} Rd,Rn,operand2
SUB指令用 Rn 的值减去操作数 operand2,并将结果存放到目的寄存器 Rd 中。
指令示例:
SUBS R1,R1,R2
SUBGT R3,R3,#1
SUB R0,R2,R3,LSL#2
;R1=R1-R2,并并根据运算的结果更新标志位
;大于则 R3=R3-1
; R0=R2-(R3<<2)
ARM分支指令
指令的条件码