Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343667
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 152
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-02 09:27
文章分类

全部博文(96)

文章存档

2017年(2)

2016年(30)

2015年(38)

2014年(25)

2013年(1)

我的朋友

分类: 嵌入式

2016-08-15 11:59:23

原文地址:ARM常用汇编指令 作者:枫露清愁

这里收集了一些ARM常用的汇编指令,方便查看

在 ARM 程序中有以下两种方法可以实现程序流程的跳转。

Ⅰ.使用专门的跳转指令。Ⅱ.直接向程序计数器 PC 写入跳转地址值。


通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用
MOV LR,PC 等类似指令,可以保存将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程序调用。


ARM 指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,一般是B和BL指令:


B 指令的格式为:B{条件}  目标地址
B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。
例:CMP r1,#0       ;当 CPSR 寄存器中的 Z 条件码置位时,程序跳转到标号 Label 处执行
    BEQ Label


BL 指令的格式为:BL{条件}  目标地址
BL 是另一个跳转指令,但跳转之前,会在寄存器 r14 中保存 PC 的当前内容,因此,可以
通过将 r14 的内容重新加载到 PC 中,来返回到跳转指令之后的那个  指令处执行。该指令
是实现子程序调用的一个基本但常用的手段


nop
空操作,  相当于 MOV r0, r0


MOV 指令的格式为:MOV{条件}{S}  目的寄存器,源操作数
MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中 S 选项决定指令的
操作是否影响 CPSR 中条件标志位的值,当没有 S  时指令不更新 CPSR中条件标志位的值。
指令示例:
MOV R1,R0                     @ 将寄存器 R0 的值传送到寄存器 R1
MOV PC,R14                   @ 将寄存器 R14 的值传送到  PC,常用于子程序返回
MOV R1,R0,LSL#3      @ 将寄存器 R0 的值左移 3 位后传送到 R1


MVN 指令的格式为:MVN{条件}{S}  目的寄存器,源操作数
与 MOV 指令不同之处是在传送之前按位被取反了,即把一个被取反的值  传送到目的寄存器中。其中S
决定指令的操作是否影响 CPSR 中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MVN r0,#0 @ 将立即数 0 取反传送到寄存器 r0 中,完成后 r0=-1


CMP{条件}  操作数 1,操作数 2
CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。
该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数 的关系(大、小、相等),
例如,当操作数1大于操作操作数2,则此后的有GT后缀的指令将可以执行。
指令示例:
CMP    R1,R0 @ 将寄存器 R1 的值与寄存器 R0 的值相减,并根据结果设置 CPSR的标志位
CMP R1,#100 @ 将寄存器 R1 的值与立即数 100 相减,并根据结果设置 CPSR 的标志位


TST{条件}  操作数 1,操作数 2
TST 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新
CPSR中条件标志位的值,该指令一般用来检测是否设置了特定的位。
当操作数1与操作数2相与之后,如果结果为0,就会在cpsr状态寄存器中把Z位置为0,eq检测Z位为零,就会调用
beq来进行跳转。
指令示例:
TST    r1,#%1 @ 用于测试在寄存器 r1 中是否设置了最低位(%表示二进制数)
beq fun @ 如果r1的最低位为0,则跳转


ADD 指令的格式为:ADD{条件}{S}  目的寄存器,操作数 1,操作数 2
ADD 指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数 1 应是一个寄存
器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。
指令示例:
ADD      R0,R1,R2                  @  R0 = R1 + R2
ADD      R0,R1,#256                 @  R0 = R1 + 256
ADD      R0,R2,R3,LSL#1        @  R0 = R2 + (R3 << 1)


SUB 指令的格式为:
SUB{条件}{S}  目的寄存器,操作数 1,操作数 2
SUB 指令用于把操作数 1 减去操作数 2,并将结果存放到目的寄存器中。操作数 1 应是一个
寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即  数。该指令可用于有
符号数或无符号数的减法运算。
指令示例:
SUB      R0,R1,R2                  @  R0 = R1 - R2
SUB      R0,R1,#256             @  R0 = R1 - 256
SUB      R0,R2,R3,LSL#1       @  R0 = R2 - (R3 << 1)


AND 指令的格式为:
AND{条件}{S}  目的寄存器,操作数 1,操作数 2
AND 指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数 1
应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个  立即数。该指令
常用于屏蔽操作数 1 的某些位。
指令示例:
AND R0,R0,#3     @ 该指令保持 R0 的 0、1 位,其余位清零。


ORR 指令的格式为:
ORR{条件}{S}  目的寄存器,操作数 1,操作数 2
ORR 指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数 1
应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个  立即数。该指令
常用于设置操作数 1 的某些位。
指令示例:
ORR R0,R0,#3        @ 该指令设置 R0 的 0、1 位,其余位保持不变。


BIC 指令的格式为:
BIC{条件}{S}  目的寄存器,操作数 1,操作数 2
BIC 指令用于清除操作数 1 的某些位,并把结果放置到目的寄存器中。操作数 1 应是一个寄
存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。   操作数 2 为 32 位的
掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不  变。
指令示例:
BIC R0,R0,#%1011     @ 该指令清除 R0 中的位  0、1、和  3,其余的位保持不变。


MUL 指令的格式为:
MUL{条件}{S}  目的寄存器,操作数 1,操作数 2
MUL 指令完成将操作数 1 与操作数 2 的乘法运算,并把结果放置到目的寄存器中,同时可
以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操  作数 2 均为 32 位的
有符号数或无符号数。
指令示例:
MUL R0,R1,R2             @ R0 = R1 × R2
MULS R0,R1,R2              @ R0 = R1 × R2,同时设置 CPSR 中的相关条件标志位


SWP 指令的格式为:
SWP{条件}  目的寄存器,源寄存器 1,[源寄存器 2]
SWP 指令用于将源寄存器 2 所指向的存储器中的字数据传送到目的寄存器中,同时将源寄
存器 1 中的字数据传送到源寄存器 2 所指向的存储器中。显然,当源寄存  器 1 和目的寄存
器为同一个寄存器时,指令交换该寄存器和存储器的内容。
指令示例:
SWP    R0,R1,[R2]   @ 将 R2 所指向的存储器中的字数据传送到 R0,同时将R1中的字
数据传送到 R2 所指向的存储单元。
SWP    R0,R0,[R1]      @ 该指令完成将 R1 所指向的存储器中的字数  据与 R0 中的数据交换。


LSL(或 ASL)的格式为:
通用寄存器,LSL(或 ASL)  操作数      
LSL (或 ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所
指定的数量向左移位,低位用零来填充。  其中,操作数可以是通用寄存器,也可以是立即
数(0~31)。
操作示例
MOV    R0, R1, LSL #2       @ 将 R1 中的内容左移两位后传送到 R0中。


LSR 的格式为:
通用寄存器,LSR  操作数        
LSR 可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左
端用零来填充。其中,操作数可以  是通用寄存器,也可以是立即数(0~31)。
操作示例: 
MOV    R0, R1, LSR #2     @ 将 R1 中的内容右移两位后传送到 R0  中,左端用零来填充。


ROR 的格式为:
通用寄存器,ROR  操作数      
ROR 可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环
移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也  可以是立即数(0~
31) 。显然,当进行 32 位的循环右移操作时,通用寄存器中的值不改变。
操作示例:
MOV     R0, R1, ROR #2        ;将 R1 中的内容循环右移两位后传送到 R0 中。


SWI 指令的格式为:
SWI{条件} 24 位的立即数
SWI 指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在 SWI
的异常处理程序中提供相应的系统服务,指令中 24 位的立即数指定用  户程序调用系统例程
的类型,相关参数通过通用寄存器传递,当指令中 24 位的立即数被忽略时,用户程序调用
系统例程的类型由通用寄存器 R0 的内容决定,同  时,参数通过其他通用寄存器传递。   
指令示例:
SWI    0x02     @ 该指令调用操作系统编号位 02 的系统例程。


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