博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARM指令后缀与常用读取指令
阅读量:2443 次
发布时间:2019-05-10

本文共 1384 字,大约阅读时间需要 4 分钟。

一:指令可选后缀

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

转载地址:http://gdsqb.baihongyu.com/

你可能感兴趣的文章
C++中的静态联编和动态联编介绍(转)
查看>>
带有农历的日历(QT版本1752-2100)(转)
查看>>
LINUX的系统内核空间的保护(转)
查看>>
在Visual C++中利用UDL文件建ADO连接(转)
查看>>
C++编程批评系列 继承的本质(转)
查看>>
共享软件中注册部分的简单实现(转)
查看>>
RedHat Linux 9下所有权和许可权限(转)
查看>>
C++程序设计从零开始之语句(转)
查看>>
利用Apache+PHP3+MySQL建立数据库驱动的动态网站(转)
查看>>
C#中实现DataGrid双向排序(转)
查看>>
利用C语言小程序来解决大问题(转)
查看>>
简单方法在C#中取得汉字的拼音的首字母(转)
查看>>
编程秘籍:使C语言高效的四大绝招(转)
查看>>
计算机加锁 把U盘变成打开电脑的钥匙(转)
查看>>
Fedora Core 4 基础教程 (上传完毕)(转)
查看>>
删除MSSQL危险存储过程的代码(转)
查看>>
红旗软件:树立国际的Linux品牌(转)
查看>>
Linux学习要点(转)
查看>>
影响mysqld安全的几个选项(转)
查看>>
最新版本Linux Flash 9 Beta开放发布(转)
查看>>