标题:
基于mini2440 的 bootloader 设计 ---- 3、ARM指令学习
[打印本页]
作者:
look_w
时间:
2017-10-24 17:16
标题:
基于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》
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0