
ARM汇编指令集汇总
1.数据传送指令
【MOV指令】:它的传送指令只能是把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量。
指令示例:
MOV R1,R0 ;将寄存器R0的值传送到寄存器R1 MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回 MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1(即乘8) MOVS PC, R14 ;将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位
除了MOV指令外,还有数据取反传送指令MVN。 【MVN指令】
指令示例:
MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反)
2.算术运算指令
(1)【加法指令】:ADD
指令示例:
ADD R0,R1,R2 ; R0 = R1 + R2 ADD R0,R1,#256 ; R0 = R1 + 256 ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)
ADDS R0,R4,R8 ; 加低端的字,R0=R4+R8 ADCS R1,R5,R9 ; 加第二个字,带进位,R1=R5+R9 ADCS R2,R6,R10 ; 加第三个字,带进位,R2=R6+R10 ADC R3,R7,R11 ; 加第四个字,带进位,R3=R7+R11
SUB R0,R1,R2 ; R0 = R1 - R2 SUB R0,R1,#256 ; R0 = R1 - 256 SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
SUBS R0,R1,R2 ;R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位
CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位 CMP R1,#100 ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位
CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位 CMN R1,#100 ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位
AND R0,R0,#3 ; 该指令保持R0的0、1位,其余位清零。
ORR R0,R0,#3 ; 该指令设置R0的0、1位,其余位保持不变。
EOR R0,R0,#3 ; 该指令反转R0的0、1位,其余位保持不变。
BIC R0,R0,#%1011 ; 该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。
TST R1,#%1 ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数) TST R1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位
TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位
二.汇编转移指令
【跳转指令】
跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:
— 使用专门的跳转指令。
— 直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:
— B 跳转指令 — BL 带返回的跳转指令 — BLX 带返回和状态切换的跳转指令 — BX 带状态切换的跳转指令
B Label ;程序无条件跳转到标号Label处执行 CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行 BEQ Label
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中
三.汇编程序状态寄存器访问指令
1、【MRS指令】
MRS指令的格式为:
MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况:
- 当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
- 当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令示例:
MRS R0,CPSR ;传送CPSR的内容到R0 MRS R0,SPSR ;传送SPSR的内容到R0
位[31:24]为条件标志位域,用f表示; 位[23:16]为状态位域,用s表示; 位[15:8]为扩展位域,用x表示; 位[7:0]为控制位域,用c表示;
MSR CPSR,R0 ;传送R0的内容到CPSR MSR SPSR,R0 ;传送R0的内容到SPSR MSR CPSR_c,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域
四.汇编加载/存储指令
ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:

指令示例:
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。 LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。 LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。 LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。 LDR R0,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。 LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。 LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。 LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。 LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。 LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。 LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。 STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。
STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。 STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。
STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。 STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。
— LDM 批量数据加载指令 — STM 批量数据存储指令
LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}
LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}为以下几种情况:
IA 每次传送后地址加1; IB 每次传送前地址加1; DA 每次传送后地址减1; DB 每次传送前地址减1; FD 满递减堆栈; ED 空递减堆栈; FA 满递增堆栈; EA 空递增堆栈;
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。 LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)。
五.汇编异常产生指令
1、【SWI指令】
SWI指令的格式为:
SWI{条件} 24位的立即数
SWI 0x02 ;该指令调用操作系统编号位02的系统例程。
BKPT 16位的立即数 BKPT指令产生软件断点中断,可用于程序的调试。
六.汇编伪代码
1.【AREA】一个汇编程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段,因此在汇编程序的开头,我们一般的语句会用到AREA。
语法格式:AREA 段名 属性 1 ,属性 2 ,....
— CODE 属性:用于定义代码段,默认为 READONLY 。 — DATA 属性:用于定义数据段,默认为 READWRITE 。 — READONLY 属性:指定本段为只读,代码段默认为 READONLY 。 — READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。 — ALIGN 属性:使用方式为ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为 0 ~31,相应的对齐方式为2表达式次方。 — COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的 COMMON 段共享同一段存储单元。
使用示例:
AREA Init , CODE , READONLY ;该伪指令定义了一个代码段,段名为 Init ,属性为只读。
2、【ALIGN】语法格式:
ALIGN { 表达式 { ,偏移量 }}
AREA Init,CODE ,READONLY,ALIEN=3;指定后面的指令为 8 字节对齐。 .... ;指令序列 .... END
AREA Init ,CODE ,READONLY .... CODE32 ;通知编译器其后的指令为 32 位的 ARM 指令 LDR R0,=NEXT+1 ;将跳转地址放入寄存器 R0 BX R0 ;程序跳转到新的位置执行,并将处理器切换到 Thumb 工作状态 .... CODE16 ;通知编译器其后的指令为 16 位的 Thumb 指令 NEXT LDR R3,=0x3FF .... END ;程序结束
AREA Init , CODE , READONLY ENTRY ;指定应用程序的入口点 .....
AREA Init , CODE , READONLY ...... END ;指定应用程序的结尾
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176555.html原文链接:https://javaforall.net
