ARM指令学习笔记
参考----------<百度>"arm百度百科","NDS百度百科"
接下来就是对arm指令的学习。
因为有过前面8086指令的学习,并且也写过像高精度计算这样的汇编程序,看arm指
心里面老在比较这两套指令。
arm7TDMI(-S)指令系统有两套指令集,分别是32位的Arm指令集和16位的thumb指令集。简单点说:arm支持arm内核的所有特点,具有高效、快速的特点;而thumb指令集灵活、小巧。二者可以互相调用,Thumb指令集可以看做是Arm的压缩形式的子集,是针对代码的密度问题而提出的,Thumb指令都有对应的Arm指令,但却不是一个完整的系统,例如:Thumb指令集没有协处理器指令,信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其它指令基本为无条件执行.,等等。不一一叙述。而Arm指令集出了具有很多Thumb没有的功能外,它最大的特点就是:高效。
Arm的寄存器是37个,包括
31generalregisters(Rxx)
6status registers(xPSR)
对这37个寄存器的详细描述我们可以从nocash.emubase.de这个网站上得到。
学习arm指令,最先接触的是寻址指令。
Arm寻址指令可分为九类:
Arm指令 80x86中有吗?
1.寄存器寻址;
2.立即寻址;
3.寄存器移位寻址; 无
4.寄存器间接寻址;
5..基址寻址;
6.多寄存器寻址; 无
7.堆栈寻址; 无
8.块拷贝寻址; 无
9.相对寻址。
可以看到arm寻址指令里面有个很大的特色是它的寄存器移位寻址,即第二个操作数在与第一个操作数结合之前可以选择进行移位操作,例如:MOVR0,R2,LSL#3。而在80x86指令中这得要三步走:一次赋值(否则影响寻址变量的值)、一次移位、一次寻址。不仅带来了视觉上的不便,而且给书写带来了麻烦(更容易出错)。另外,Arm指令还可以进行多寄存器寻址,无疑简化了操作(具体点讲,就是少写很多"LD""ST")。还可以看到我们在arm指令中只需加个"!"就可以决定中间值是否保留。更加方便的是我们可以自由选择变址前后指针的变化,例如块拷贝寻址中就有四种:STMIA,STMIB,STMDA,STMDB.连递减还是递增,先变址还是先复制,Arm都给你预先设计好了,不能不说它周全,这些都是80x86里没有的,极大地方便了程序员的程序设计。
顺带说一下其另一个便捷之处,加载/装填数据时,可以在命令后加H/B来表示对半字/字节的数据操作,默认情况下是字。并且ARM可以实现一组寄存器和一块连续内存之间传送数据,如LDMIA和STMIA指令。
看完寻址,接下来才是Arm指令的重点,
Arm指令的基本格式为:
————————arm的32伪指令二进制格式
其中<>内的项是必须的,而{}内的项是可选的。
Opcode:指令助记符
Cond:执行条件
S:是否影响cpsr寄存器的值
Rd:目标寄存器
Rn:第一个操作数的寄存器
Oprand2:第二个操作数
ARM指令可以分为6大类
(1) 跳转指令 B、BL、BLX、BX
(2)数据处理指令 数据传送\算术逻辑运算\比较
(3)程序状态寄存器传输指令
(4)load/store指令
(5)协处理指令
(6)异常中断指令
可以看到
MOVE rcra
CMP rarb
JG NEXT
MOVE
ARM指令学习笔 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)