arm的汇编指令精选合辑
器。
格式:
MSR{《条件码》CPSR_f|SPSR_f,《#ommed_8r》
MSR{《条件码》CPSR_《field》|SPSR_《field》,Rm
其中:
《field》字段可以是以下之一或多种:
lC:控制域屏蔽字段(PSR中的第0位到第7位);
lX:扩展域屏蔽字段(PSR中的第8位到第15位);
lS:状态域屏蔽字段(PSR中的第16位到第32位);
lF:标志域屏蔽字段(PSR中的第24位到第31位)。
immed_8r 值数字常量的表达式。常量必须对应8位位图。该位图在32位字中循环移位偶数数位。
Rm 源寄存器。
注释:
同前一条指令(MRS)。
例1:设置N、Z、C、V标志。
MSR CPSR_f,#&f0000000 ;仅高位有效,其他必须为0
例2:
仅置位C标志,保留N、Z、V标志。
MRS R0,CPSR ;将CPSR中的内容传送至R0
ORR R0,R0,#&1f ;置位R0的第29位
MSR CPSR_c,R0 ;再将R0中的内容传送至CPSR
3 软件中断指令SWI
格式:
SWI{《条件码》immed_24
其中:
immed_24 表达式,其值范围为0~ -1的整数(24位整数)。
注释:
(1) SWI指令用来执行系统调用,处理器进入管理模式,并从地址0x08开始执行指令《24位立即数》并不影响指令的执行,由系统所解释。CPSR保存到管理模式的SPSR中执行转移到SWI向量。
(2) 条件码标志。这条指令不影响条件码标志。
例1:输出字符"A"
MOV R0,#"A" ;从R0中得到"A"
SWI SWI_WriteC ;然后显示
例2:通过SWI指令输出字符串
…
BL STROUT ;输出如下信息
= "Hello World",&0a,&0d,0
… ;返回
STROUT LDRB R0,R[14],#1 ;得到字符
CMP R0,#0 ;检查结束标记
SWINE SWI_WriteC ;如果没有结束,则继续
BNE STROUT ;…循环
ADD R14,#3 ;字对齐
BIC R14,#3
MOV PC,R14 ;返回
例3:结束用户程序返回监控程序
SWI SWI _Exit ;返回
4 断占指令(v5T)
格式:
BKPT immmed_16
其中:
immmed_16 表达式,基值范围为0~65536内的整数(16位整数)。
注释:
支持软件调试,执行时中断正常指令,进入相应的调试子程序。BKPT指令适用于ARM v5指令系统及以上版本。
例:
BKPT
3.3 Thumb指令系统
并非所有的ARM处理器都可以执行Thumb指令,在指令集名中,含有T的均可执行Thumb指令,如ARM7TDMI。
CPSR中的T标志决定是执行Thumb指令还是ARM指令,如置位,执行Thumb指令,否则执行ARM指令。
ARM在复位以后,执行ARM指令。通常至Thumb指令的执行是由一条转移和交换指令完成的,如BX指令。但是例程处理程序中如果使用数据处理指令或者多寄存器调用指令,也会转移到Thumb指令中去。如果例程处理完毕,也将返回ARM指令中。
必须明确的是Thumb指令系统必须包括ARM代码,至少是初始化和例程入口部分。
Thumb指令集是ARM指令集的子集,Thumb只使用有限的ARM寄存器。Thumb指令一般可以完全访问通用寄存器R0~R7(称为低寄存器),R13用作堆栈指针,R14用作链接寄存器,R15用作PC。Thumb中的一些指令可以访问其余的寄存器如R8~R15(称为高寄存器),算术运算和逻辑运算指令可以访问CPS2中的标志位。
大部分的Thumb 指令与ARM指令类似,不过在寄存器、立即数、寻址等方面会有些差异,Thumb和ARM指令性计划集的区别一般有以下几点:
l转移指令;
l数据传送指令;
l单寄存器Load和Store指令;
l多寄存器Load和Store指令。
Thumb指令集没有协处理器指令、信号量(samaphore)指令以及访问CPSR或SPSR的指令。
(1) 转移指令
转移指令用于:
l向后转移形成循环;
l条件结构向前转移;
l转向子程序;
l处理器从Thumb状态切换到ARM状态。
程序相对转移,特别是条件转移与在ARM状态下相比,在范围上有更多的限制,转向子程序只能是无条件转移。
(2) 数据处理指令
这些指令对通用寄存器进行操作,在许多情况下,操作的结果必须放入其中一个操作数寄存器中,而不是第3个寄存器中。数据处理操作比ARM状态更少,访问寄存器R8~R15受到一定限制。
MOV或ADD指令可访问寄存器R8~R15,数据处理指令总是更新CPS2中的ALU状态标志。访问寄存器R8~R15的Thumb数据处理指令不能更新标志。
(3) 单寄存器Load和Store指令
这些指令从存储器读取1个寄存器值,或把1个寄存器值存储到存储器。在Thumb状态下,这些指令只能访问寄存器R0~R7。
(4) 多寄存器Load和Store指令
LDM和STM将任何范围为R0~R7的寄存器
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)