一:指令可选后缀
“S”后缀:指令中使用“S”后缀,指令执行后状态寄存器的条件标志位将被刷新;不使用“S”后缀时,指令执行后状态寄存器的条件标志位不会发生变化。此标志经常用于对条件进行测试,例如:是否溢出,是否进位等;根据这些变化,就可以进行一些判断,是否大于,是否相等,从而可能影响指令执行顺序。
“!”后缀
如果指令地址表达式中不含“!”后缀,则基址寄存器中的地址不会发生变化,指令中含有则变化,变化结果如下:
基址寄存器中的值(指令执行后)=指令执行前的值+地址偏移量
注意:
“!”后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量。
“!”后缀不能用于R15(PC)的后面
当用于单个寄存器后面时,必须确性这个寄存器有隐性的偏移量,eg:“STMDB SP!,{R3,R5,R7}”此时地址基址寄存器SP的隐性偏移量是4.
二:具体的指令
LDR/STR 字数据加载/存储指令
LDRB/STRB 字节数据加载/存储指令
LDRH/STRH 半字数据加载/存储指令
Eg:LDR R4,START ;将存储地址为START的字数据读入R4
LDR R0,[R1] ;将存储地址为R1的字数据读入R0
LDR R0,[R1,R2] ;将存储地址为R1+R2的字数据读入R0
LDR R0,[R1,#8] ;将存储地址为R1+8的字数据读入R0
LDR R0,[R1,R2,LSL#2] ;将存储地址为R1+R2<<2的字数据读入R0
STR R5,DATA1 ;将R5存入存储地址为DATA1中
同理可以判断出其他STR的形式所表达的意思。
数据加载与存储(Load-store)指令用于存储器和处理器的寄存器之间数据传输。
Load用于把内存中的数据装载到寄存器中去。
Store用于把寄存器的数据存储到内存中去。
注意:LDRR5,[R6,#0x04]! 是先把R6+4作为地址,把数据传输结束后,在把R6=R6+4.
LDR R5,[R6],#0x04 是先把R6作为地址,把数据传输结束后,把R6=R6+4
STMFDSP!,{R0-R4} 将R0-R4中的数据压入堆栈,R13为堆栈指针。
LDMFDSP!,{R0-R4} 将数据出栈,恢复R0-R4的值。
DCD用于分配一段字内存单元,并用伪指令中的expr初始化.DCD伪指令分配的内存需要字对齐,一般可用来定义数据表格或其它常数。
Eg:DATA DCD 4,5,6 DATA指向这块内存起始地址,内存为3个单元,并且内容为4,5,6.
注意,,标号相当与一个常数,所以在 LDR R0,DATA,时,R0中内容就是DATA的值。
LR就是ARM中R14,子程序链接寄存器,SP就是ARM中R13栈指针寄存器,R15就是PC,程序计数器。
当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。
读状态寄存器指令.在 ARM 处理器中,只有 MRS 指令可以状态寄存器CPSR或SPSR读出到通用寄存器中.指令格式如下;
写状态寄存器指令.在 ARM 处理器中.只有 MSR 指令可以直接设置状态寄存器 CPSR或 SPSR.指令格式如下
SPSR是用来备份CPSR的寄存器,当异常发生时,SPSR自动将上一个状态的CPSR备份出来,便于在后面恢复上一个状态。
上一篇:STM32串口一直进中断解决方法
下一篇:mini2440----keil for AMR之IIC读写EEPROM(AT24C08)
推荐阅读最新更新时间:2024-03-16 15:47