首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于mini2440 的 bootloader 设计 ---- 3、ARM指令学习

基于mini2440 的 bootloader 设计 ---- 3、ARM指令学习

开发环境:
               电脑系统:RedHat Enterprise Linux6   kernel version : linux-2.6.32
               交叉工具链:arm-linux-xxx4.3.2
               开发板版本:mini2440 S3C2440处理器  64M SDRAM   256M nand flash



一、寻址方式


定义:处理器根据指令中给出的信息寻找到操作数的方式就叫做寻址方式。这里的操作数一般指目的操作数。

1、立即数寻址:
     特点:操作数直接存放在指令当中,取到指令就拿到操作数。
     例子:add   r0,r0,#30 ; r0<--r0+30    (立即数需用 # 当前缀)
2、寄存器寻址:
     特点:操作数存放在寄存器中。
     例子:add   r0, r1, r2 ; r0 <-- r1+r2
3、寄存器间接寻址:
     特点:操作数放在内存中,内存地址放在寄存器中。
     例子:ldr  r0, [r1];   r0  <-- [r1]
4、基址变址寻址:
     特点:操作数放在内存中,其地址由寄存器的值加上指令中的立即数得到。
     例子:ldr  r0, [r1,#4];   r0  <-- [r1+4]
5、相对寻址:
     特点:PC指针的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
     例子:bl next (程序跳转指令)
二、指令分类学习
1、算术和逻辑类指令:add、sub、mov、mvn、and、orr、bic
1.1、add
     格式:add{条件}{S} <dest>, <op1>, <op2>

  功能:将op1与op2相加,结果存放到dest <dest、op1必须是寄存器, op2可以是立即数、寄存器>

     例子:add r0, r1,r2
1.2、sub

  格式:sub{条件}{S} <dest>, <op1>, <op2>



  功能:op1-op2,结果存放到dest <dest、
op1必须是寄存器, op2可以是立即数、寄存器>

     例子:sub r0, r1,r2
1.3、mov


               格式:mov{t条件}{S} <dest>, <op1>



  功能:op1存放到dest <dest必须是寄存器, op1可以是立即数、寄存器>

     例子:mov r1, r0
1、4、mvn



     格式:mvn{条件}{S} <dest>, <op1>



  功能:op1取反后存放到dest <dest必须是寄存器, op1可以是立即数、寄存器>

     例子:mvn r1, r0
1.5、and


         格式:and{条件}{S}  <dest>, <op1>, <op2>




  功能:op1跟op2进行按位与,结果存放到dest <dest、op1必须是寄存器, op2可以是立即数、寄存器>

     例子:orr r3, r1, r0
1.6、orr
   格式: orr{条件}{S}  <dest>, <op1>, <op2>



  功能:op1跟op2进行按位或,结果存放到dest <dest、op1必须是寄存器, op2可以是立即数、寄存器>

     例子:orr r3, r1, r0
1.7、bic

     格式: orr{条件}{S}  <dest>, <op1>, <op2>



  功能:op1跟op2进行按位清除,结果存放到dest <dest、op1必须是寄存器, op2可以是立即数、寄存           器>,遇1被清除,与or相反

     例子:orr r3, r1, #1011B ;0、1、3 被清除,2保留

2、比较类指令:cmp、tst
2.1、cmp


     格式: cmp{条件}{p} <op1>, <op2>



  功能:op1-op2,结果影响CPSR中的标志位

     例子:cmp r1,r2


2.2、tst


     格式: tst{条件}{p} <op1>, <op2>



  功能:op1 AND op2,结果影响CPSR中的标志位

     例子:cmp r1,#1


3、跳转指令:b、bl
3.1、b



     格式: b{条件} <地址>


  功能:跳转到<地址>处执行,且不保存返回地址,即lr 中没有跳转前的地址

     例子:b next
3.2、bl




     格式: bl{条件} <地址>



  功能:跳转到<地址>处执行,且保存返回地址,即lr 中保存有跳转前的地址

     例子:bl next

4、移位指令:lsl、lsr、ror
4.1、lsl


     格式: rx, lsl#n


  功能:将rx左移n位,低位补零

     例子:mov r1, #12
           mov r0, r1,lsl#2 ; r0=48=12<<2
4.2、lsr


    格式: rx, lsr#n


  功能:将rx右移n位,高位补零

     例子:mov r1, #12
           mov r0, r1,lsr#2 ; r0=3=12>>2


4.3、ror


    格式: rx, ror#n


  功能:将rx循环右移n位,低位补高位

     例子:mov r1, #12
           mov r0, r1,lsl#2 ; r0=48=12<<2
5、程序状态字访问指令:msr、mrs
5.1、msr



     格式: msr cpsr, rx


  功能:将rx复制到cpsr中

     例子:msr cpsr, r0
5.2、mrs




     格式: mrs rx, cpsr


  功能:将cpsr复制到rx中

     例子:msr r0, cpsr

6、存储器访问指令:ldr、str
6.1、ldr


     格式:  ldr{条件}  rd,[地址]


  功能:将地址中的内容复制到rd中

     例子:ldr r0, [#30008000]
6.2、str


     格式:  str{条件}  rd,[地址]


  功能:将rd中的内容复制到[地址中]

     例子:ldr r0, [#30008000]


     以上就是基本的ARM指令,当然,每种类型的指令还有很多,这里只是介绍了一些基本且经常遇到的,若想查看完整的指令集,还得参考手册
《ARM Architecture  Reference Manual》
返回列表