ARM指令后缀与常用读取指令

来源:互联网 发布:好的交友软件 编辑:程序博客网 时间:2024/06/06 18:20

一:指令可选后缀

“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备份出来,便于在后面恢复上一个状态。



原创粉丝点击