1. MSR与MRS
MRS
MRS{条件} 通用寄存器,程序状态寄存器(CPSR 或SPSR)
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用于以下两种情况:
(1)当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
(2)当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令示例:
MRS R0,CPSR //传送CPSR的内容到R0
MRS R0,SPSR //传送SPSR的内容到R0
MSR
MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,操作数
MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
(1)位[31:24]为条件标志位域,用f表示;
(2)位[23:16]为状态位域,用s表示;
(3)位[15:8]为扩展位域,用x表示;
(4)位[7:0]为控制位域,用c表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。
指令示例:
MSR CPSR,R0//传送R0的内容到CPSR
MSR SPSR,R0//传送R0的内容到SPSR
MSR CPSR_c,R0 //传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域
BIC
BIC{条件}{S} 目的寄存器,操作数1,操作数2
注意指令后面加了S表示运算结果会影响CPSR寄存器的条件位,也就是说指令执行完后更新flag标志位。
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。操作数2为32位的掩码,如果在掩码中置了某一位1,则清除这一位。未设置的掩码位保持不变。
bic r0,r0,#0x1f
0x1f=11111b
其含义:清除r0的bit[4:0]位。
LDR与STR
LDR{条件} 目的寄存器,<存储器地址>
LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
指令示例:
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
注意:
(1):ldr和ldr.w之间的区别——.W是可选的指令宽度说明符.它不会影响指令的行为,它只是确保生成32位Thumb指令,我们看到.w后缀就可以判断当前指令为Thumb指令。
(2):ldr、ldrb、ldrh的区别——依次为读一个32位的字数据,读一个8位的字节数据,读一个16位的半字数据。
STR{条件} 源寄存器,<存储器地址>
STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。
指令示例:
STR R0,[R1],#8;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8];将R0中的字数据写入以R1+8为地址的存储器中。