基于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》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值