Chinaunix首页 | 论坛 | 博客
  • 博客访问: 375486
  • 博文数量: 96
  • 博客积分: 647
  • 博客等级: 上士
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-29 22:15
文章分类
文章存档

2015年(1)

2014年(10)

2013年(26)

2012年(59)

我的朋友

分类:

2012-11-22 15:28:20

原文地址:arm汇编指令 作者:kine1314

LDR 和 STR——用于字和无符号字节

指令格式:

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) [RnFlexoffset]{!} 在数据传送之前,将偏移量 Flexoffset

加到 Rn 中。其结果作为传送数据的存储器地址。若使用后缀!,则结果写回到 Rn 中,

 Rn 不允许是 R15,如:

LDRB R0,[R1,#8] ; *r0=*(r1+8)r1地址+8后的数据传给r0

LDR R0,[R1,#8] ; *r0=*(r1+8); *r1 = *r0r1地址+8后的数据传给r0,并返回给r1

程序相对偏移(program relative) labellabel 必须是在当前指令的土4KB 范围内) 。

程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成

前索引指令,不能使用后缀!,如:

LDR R0,place

place 地址装入 R0

后索引偏移(post-indexed offset) [Rn]Flexoffset。在数据传送后,将偏移量 Flexoffset

加到 Rn 中,结果写回到 RnRn 不允许是 R15,如:

LDR R0,[R1],R2,LSL2

;将存储器地址为 R1 的字数据读入寄存器 R0,并将

新地址 R1R2×4 写入 R1

R0=R1R2×4

用于字和无符号字节的存取指令, 偏移量Flexoffset可以是下两种形式之:

1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:

STR R5,[R7],#--8

2)一个寄存器再加上移位(移位由立即数指定),如:{-}Rm{,shift}

其中:

:可选负号。若带符号,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。

Rm :内含偏移量的寄存器。Rm 不允许是R15

ShiftRm 的可选移位方法。可以是下列形式的任何一种:

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

位(指令 ORREORBIC 对标志位的影响同 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

.

.

.

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#

R1=R1-R2,并并根据运算的结果更新标志位

;大于则 R3=R3-

 R0=R2-(R3<<2)

ARM分支指令

指令的条件码

 

阅读(1074) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~