常用的arm汇编指令(1)

1. BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态从ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以 通过将寄存器R14值复制到PC中来完成。


2.除此之外,还有反向减法指令RSB:RSB.W Rd,Rn, #imm12 ; Rd = imm12-Rn    RSB.W Rd,Rn, Rm ; Rd = Rm-Rn.CPSR:程序状态寄存器(current program status register) cpsr在用户级编程时用于存储条件码;CPSR包含条件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息。


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表示十六进制.


9.LDMIA R0! ,{R3-R9} ;加R0指向的地址上连续空间的数据,保存到R3-R9当中,!表示R0值更新,IA后缀表示按WORD递增 LDMFD SP!,{R0-R7,PC}^;恢复现场,异常处理返回,^表示不允许在用户模式下使用。


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 向外部导入一个符号,一般是外部程序全局变量。


R7:栈帧指针(Frame Pointer).指向前一个保存的栈帧(stack frame)和链接寄存器(link register, lr)在栈上的地址
R13:又叫SP(stack pointer),是栈顶指针
R14:又叫LR(link register),存放函数的返回地址。
R15:又叫PC(program counter),指向当前指令地址
------------------------------
r0,r1,r2,r3,在调用函数时,用来存放前4个函数参数和返回值,
r4-r11,r14,在调用函数时必须保存这些寄存器到堆栈当中。如果函数的
参数多于4个,则多余参数存放在堆栈当中,即sp,sp+4,sp+8,…依次类推。
TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位
TST{条件}操作数1, 操作数2意思:将寄存器与另外一个寄存器的内容进行按位与的运算,根据结果更新CPSR中条件标志位的值。它一般用来检测是否设置了特定的位。
CLZ Count left zero 计算操作数最高端0的个数,CLZ指令返回操作数二进制编码中第一个1前0的个数。
RSB指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。

指令示例: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 加载的地址范围要宽。

你可能感兴趣的:(命令与ARM汇编)