1. BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态从ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以 通过将寄存器R14值复制到PC中来完成。
3.备份程序状态寄存器SPSR(Backups Program statues register)。当特定的异常中断发生时,SPSR用于存放CPSR中的内容,在异常中断处理完成后,可以用SPSR中的内容来恢复CPSR。已达到保护并恢复中断现场作用。SPSR的格式与CPSR的格式完全相同。
4.B指令(Branch)表示无条件跳转,B main ;跳转到标号为main地代码处,BL指令(Branch with Link)表示带返回值的跳转. BL比B多做一步,在跳转前,BL会把当前位置保存在R14(即LR寄存器),当跳转代码结束后,用MOV PC,LR指令跳回来,这实际上就是C语言执行函数的用法,汇编里调子程序都用BL,执行完子函数后,可以用MOV PC,LR跳回来。MVN R0, #0 ;把0取反(即-1)传给R0。
5.LDR R0,[R1]; R1的值当成地址,再从这个地址装入数据到R0 (R0=*R1)。LDR R1,=0x30008000 ; 把地0x30008000的值装入到R1中,LDR中用常数要用=打头.(注意跟MOV的区别,MOV是#)。 STR(Store) 用于把一个寄存器的值存入外部存储空间,是LDR的逆操作。STR R0,[R1] ; 把R0的值,存入到R1对应地址空间上(*R1 = R0)。
6.ADDS R0,R1,R2; R0=R1+R2,ADDS中S表示把进位结果写入CPSR,ADC R5,R3,R4 ;R5=R3+R4+C。SUBS R0,R1,R2; R0=R1-R2,SUBS中S表示把进位结果写入CPSR,SBC R5,R3,R4 ;R5=R3-R4-C
7.AND位与指令 AND R0,R1,#0xFF ; R0=R1 & 0xFF; TST测试某一位是否为1,并把结果写入CPSR,供下一句使用,TST R1,#0xffe; 等同于if(R1 & 0xffe);
8.BIC清位操作BIC R0,R0,#%1011 ; 该指令清除 R0 中的位 0 1 3,其余的位保持; %表示是二进制,0x表示十六进制.
10.STM 从寄存器列表向存储空间传值。STMIA R1!,{R3-R9} ;将R3-R9的数据存储到R1指向的地址上,R1值更新。STMFD SP!,{R0-R7,LR}; 现场保存,将R0~R7,LR入栈
11.ASR(算术右移),ROR(循环右移)RRX带扩展的循环右移。符号定义指令全局变量定义 GBLA ,GBLL,GBLS。局域变量定义 LCLA,LCLL,LCLS。变量赋值SETA,SETL,SETS其中上述伪指令中,最后面的A表示给一个算术变量赋值,L表示用于给一个逻辑变量赋值,s表示给一个字符串赋值。
12.SPACE 定义一个内存空间,并用0初始化。 DCB 定义一个连续字节内存空间,用伪指令的表达式expr来初始化.一般可以用定义数据表格,或文字字符串.(这时等同于SETS),用于初始二进制BUFFER。 DCU定义的一段字的内存空间(DCB是字节),并用后面表达式初始化。
13.字节对齐 ALIGN 定义一个数字常量定义 EQU。 声明一个外部符符号IMPORT,EXTERN 向外部导入一个符号,一般是外部程序全局变量。
指令示例:RSB R0,R1,R2 ; R0 = R2 – R1
14.STMFD SP!, {R0~R7, LR} , start_address = sp - 9 * 4 , end_address = sp - 4
把寄存器r0~r7和LR(r14)共9个寄存器,存储到start_address开始, 到end_address结束的栈中,并且修改SP的值(SP变小),相当于压栈。LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
DCD /DCDU:用于分配一片连续的字存储单元并用指定的数据初始化。ADRL: 将相对于程序或相对于寄存器的地址载入寄存器中。 与 ADR 指令相似。ADRL 生成两个数据处理指令,因此它比 ADR 加载的地址范围要宽。