Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148183
  • 博文数量: 43
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 601
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-22 17:24
文章分类
文章存档

2010年(43)

我的朋友

分类: LINUX

2010-12-04 12:01:33

   ARM的常用指令可以分成下面的几个类,前六种遵循汇编指令的规则,而第七种是协处理器的指令,需要单独的去理解记忆。
1.跳转指令
2.数据处理指令
3.乘法指令
4.状态寄存器访问指令
5.Load/Store内存访问指令
6.移位指令
7.协处理器指令
                                 一、跳转指令
跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转: 
—--直接向程序计数器PC写入跳转地址值
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用 MOV  r10,PC 等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用
—--使用专门的跳转指令
B、BL、BLX 等
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:
  —  B   跳转指令
   —  BL  带返回的跳转指令
   —  BLX 带返回和状态切换的跳转指令
   —  BX  带状态切换的跳转指令
1、B指令 
格式: B{条件} 目标地址
B指令是最简单的跳转指令。一旦遇到一个B指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行
注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址
例:
  B Label     ;程序无条件跳转到标号Label处执行

     CMP R1,#0
     BEQ Label    ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行
2、BL指令 
格式: BL{条件} 目标地址 
BL在跳转之前,会在寄存器R14中保存PC的当前内容,然后再跳转到相应的标号处执行
可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行
例:
  BL Label
    ……
label:
   ……
  mov  pc,lr
3、 BX指令
格式: BX{条件} 目标地址 
带状态切换的跳转指令,跳转到指令中所指定的目标地址处执行。目标地址处的指令既可以是ARM指令,也可以是Thumb指令

4、BLX指令
格式: BLX 目标地址 
BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中
子程序的返回可以通过将寄存器R14值复制到PC中来完成

本段学习关键点: 
1.直接跳转和间接跳转,知道可以跳转的是4G,芯片内部3G,外部1G
2.label是一个任意的标志,除了可以是在汇编中的标识符以外,在bootloader中还可以看出来,可以是c语言的函数名字,所以说label是一个任意的东西,当然不可能是句实际的代码
3.带x就表示切换状态,带L就表示可以保存当前的状态

                          二、数据处理指令
数据处理指令根据指令实现处理功能可分为以下五类: 
1.数据传送指令
2.比较指令
3.测试指令
4.算术运算指令
5.逻辑运算指令

数据处理指令包括: 
— MOV 数据传送指令  — MVN 数据取反传送指令 
— CMP 比较指令 — CMN 反值比较指令 
— TST 位测试指令 — TEQ 相等测试指令 
— ADD 加法指令 — ADC 带进位加法指令 
— SUB 减法指令 — SBC 带借位减法指令 
— RSB 逆向减法指令  — RSC 带借位的逆向减法指令
— AND 按位与指令 — ORR 按位或指令 
— EOR按位异或指令  — BIC 位清除指令
   1、MOV指令
MOV指令的格式为:MOV{条件}{S} 目的寄存器,源操作数 
MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值
例:
  MOV R1,R0 
 ;将寄存器R0的值传送到寄存器R1 
 MOVEQ PC,R14 
     ;根据Z标志位,决定是否将R14的值传送到PC
    MOVS R1,R0,LSL#3 
        ;将寄存器R0的值左移3位后传送到R1 ,并影响标志位
   2、MVN指令 
MVN指令的格式为:
MVN{条件}{S} 目的寄存器,源操作数
 与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中
 
MVN R0,#0
     ;将立即数0取反传送到寄存器R0中,完成后R0=-1
   3、CMP指令
CMP指令的格式为:CMP{条件} 操作数1,操作数2 
CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位

   CMP R1,R0       ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位

      CMP R1,#100     ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位
4、CMN指令
CMN指令的格式为: CMN{条件} 操作数1,操作数2 
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位
       
         CMN R1,R0       ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位 
       CMN R1,#100   ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位 
   5、TST指令 
TST指令的格式为:
     TST{条件} 操作数1,操作数2 
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值

      TST R1,#%1   ;用于测试在寄存器R1中是否设 置了最低位(%表示二进制数) 
         TST R1,#0xffe  ;将寄存器R1的值与立即数 0xffe按位与,并根据结果设置CPSR的标志位 
6、TEQ指令 
TEQ指令的格式为: 
      TEQ{条件} 操作数1,操作数2 
TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值
该指令通常用于比较操作数1和操作数2是否相等
    TEQ R1,R2
    ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位
7、ADD指令 
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)
8、 ADC指令 
ADC指令的格式为:
 ADC{条件}{S} 目的寄存器,操作数1,操作数2
 
ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中
9、 SUB指令 
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)
10、SBC指令
SBC指令的格式为:
    SBC{条件}{S} 目的寄存器,操作数1,操作数2 
SBC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中

SUBS R0,R1,R2     ;R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位 
11、RSB指令 
RSB指令的格式为:
   RSB{条件}{S} 目的寄存器,操作数1,操作数2

RSB指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中

   RSB R0,R1,R2        ;R0 = R2 – R1
   RSB R0,R1,#256      ;R0 = 256 – R1
   RSB R0,R2,R3,LSL#1 ;R0 = (R3 << 1)- R2
12、RSC指令
 RSC指令的格式为:
    RSC{条件}{S} 目的寄存器,操作数1,操作数2
 
RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中

    RSC R0,R1,R2 ; R0 = R2 – R1 - !C
13、AND指令 
AND指令的格式为:
  AND{条件}{S} 目的寄存器,操作数1,操作数2
AND指令用于在两个操作数上进行按位与运算,并把结果放置到目的寄存器中
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1的某些位
   AND R0,R0,#3 ;该指令保持R0的0、1位,其余位清零
14、ORR指令 
ORR指令的格式为: ORR{条件}{S} 目的寄存器,操作数1,操作数2 
ORR指令用于在两个操作数上进行按位或运算,并把结果放置到目的寄存器中。
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。 
ORR R0,R0,#3  ;该指令设置R0的0、1位,其余位保持不变
15、EOR指令
EOR指令的格式为: 
  EOR{条件}{S} 目的寄存器,操作数1,操作数2 
EOR指令用于在两个操作数上进行按位异或运算,并把结果放置到目的寄存器中
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数1的某些位 
   EOR R0,R0,#3 
   ;该指令反转R0的0、1位,其余位保持不变
16、BIC指令
 BIC指令的格式为: BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变
    BIC R0,R0,#%1011
    ;该指令清除 R0 中的位 0、1、和 3,其余的位保持不变



本段学习的关键点:
1.所有的条件码的比较对象只是标志位,如果标志位没有发生改变,条件码就不会发生作用,这也就是arm汇编的条件编译,好好理解一下
MOVEQ PC,R14 
比如这句代码,eq表示如果相等就把r14中的值赋值给pc,那么问题就是,如果什么相等?单就看这段代码这一句话是没有任何意义的,它的前面可定会有一句代码是影响标志位z的。
  MOVEQ PC,R14 
     ;根据Z标志位,决定是否将R14的值传送到PC
所以这句代码应该是上面的解释,是不一定会被执行的。
2.这个图是条件码的对应表
3.tst teq cmp cmn 这4个不带s也可以使n,z,c,v发生置位
4.除法是用移位和减法来实现的,除以5就是右移两位再减一

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