ARM程序设计基础
数据保存到存储器中。
;存储指针在保存第一个值之后增加,
;增长方向为向上增长。
STMIB R0!,{R1-R7} ;将R1~R7的数据保存到存储器中。
;存储指针在保存第一个值之前增加,
;增长方向为向上增长。
注意:
1)IA:每次传送后地址加4
2)IB:每次传送前地址加4
3)DA:每次传送后地址减4
4)DB:每次传送前地址减4
5)FD:满递减堆栈
6)ED:空递减堆栈
7)FA:满递增堆栈
8)EA:空递增堆栈
R0!后缀“!”表示最后的地址回写到R0中。
LDMIAR0!,{R2—R3}执行过程分析:
当把R0指向的地址0xFF00中的数据加载到R2后,地址加4,变为0xFF04;接着把0xFF04中的数据加载到R3,地址变为0xFF08。最后把该地址回写到R0。
2.3 ARM指令集
n跳转指令
n数据处理指令
n程序状态寄存器处理指令
n加载/存储指令
n协处理器指令
n异常产生指令
1跳转指令
n在ARM程序中实现程序流程的跳转有两种方法
v使用专门的跳转指令
v直接向程序计数器PC写入跳转地址值
nARM指令集中的跳转指令包括以下4条指令
vB 跳转指令
vBL 带返回的跳转指令
vBLX 带返回和状态切换的跳转指令
vBX 带状态切换的跳转指令
注意:一旦遇到一个B指令,ARM 处理器将立即跳转到给定的目标地址执行。存储在跳转指令中的实际值是相对当前PC值的一个偏移量,由汇编器来计算。
BL 带返回的跳转指令
跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本手段。
2数据处理指令
n数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。
n数据传送指令用于在寄存器和存储器之间进行数据的双向传输。
n算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。
n比较指令不保存运算结果,只更新CPSR中相应的条件标志位。
MOV{条件}{S} 目的寄存器,源操作数
MVN{条件}{S} 目的寄存器,源操作数
与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。
CMP{条件} 操作数1,操作数2
CMP指令用于比较一个寄存器的内容和另一个寄存器的内容或立即数,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。
CMN{条件} 操作数1,操作数2
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。
TST{条件} 操作数1,操作数2
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。
TEQ{条件} 操作数1,操作数2
用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。
ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC指令用于把两个操作数相加,再加上CPSR的C条件标志位的值,并将结果存放到目的寄存器中。
SUB{条件}{S} 目的寄存器,操作数1,操作数2
SBC{条件}{S} 目的寄存器,操作数1,操作数2
SBC指令用于把操作数1减去操作数2,再减去CPSR的C条件标志位的反码,并将结果存放到目的寄存器中。
RSB{条件}{S} 目的寄存器,操作数1,操作数2
RSB指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。
RSC{条件}{S} 目的寄存器,操作数1,操作数2
RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。
AND{条件}{S} 目的寄存器,操作数1,操作数2
OR{条件}{S} 目的寄存器,操作数1,操作数2
EOR{条件}{S} 目的寄存器,操作数1,操作数2
EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。
nMUL 32位乘法指令
nMLA 32位乘加指令
nSMULL 64位有符号数乘法指令
nSMLAL 64位有符号数乘加指令
nUMULL 64位无符号数乘法指令
nUMLAL 64位无符号数乘加指令
ASR n 算术右移n位(1<=n<=32)
LSL n 逻辑左移n位(1<=n<=32)
LSR n 逻辑右移n位(1<=n<=32)
ROR n 循环右移n位(1<=n<=32)
RRX 带扩展的循环右移1位
3程序状态寄存
ARM程序设计基 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
