ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ARM寄存器R15存放偏移量计算的问题

2021-07-15 09:00:57  阅读:146  来源: 互联网

标签:R15 R0 R1 偏移量 PC 地址 指令 STR ARM


程序计数器PC(R15):由于ARM采用流水线机制,PC值为当前指令地址值加8字节,ARM指令集中,PC指向当前指令的下两条指令的地址,由于ARM指令是字对齐的,PC值的bit0位和bit1位的值总为0,即PC值为4的倍数。

     当使用STR/STM指令保存R15时,保存的可能是当前指令地址加8字节或12字节,具体采用哪种方式取决于具体的芯片设计方式。同一芯片只能采用一种方式,如下代码可测试出芯片采用的地址偏移量:

      SUB R1, PC, #4            ;R1中存放下面STR指令的地址
      STR PC, [R0]                ;将PC=STR地址+offset保存到R0中
      LDR R0, [R0]                ;
      SUB R0, R0, R1            ;将offset=PC-STR地址保存到R0中  

在这个问题中,8字节和12字节是根据什么决定的?

 

解答:

1.

我是这么理解的,假设是顺序执行,没有跳转分支,本来pc的值是等于当前执行指令地址+8字节的地址,即指向当前指令的下2条指令地址。但是当使用STR/STM这个命令将PC的值保存到RAM或其他寄存器时,这个过程的实现在不同的芯片上有不同的设计,有的芯片实现这个功能时保留了原来的偏移量,即8个字节,但是有的芯片设计时出于某种结构上或性能上或其他方面的考虑,将原来的8个字节不得不改成了12个字节。所以导致了在使用STR/STM保存PC的值时出现了两种不同的偏移量。
我开始是将使用STR/STM保存时的偏移量与PC自己的偏移量弄混了。

2.

     SUB R1, PC, #4            ;R1中存放下面STR指令的地址
      STR PC, [R0]                ;将PC=STR地址+offset保存到R0中
      LDR R0, [R0]                ;
      SUB R0, R0, R1            ;将offset=PC-STR地址保存到R0中  

由此来说,测试使用STR/STM的偏移量的过程应该是这样的:
(1)首先将PC的值减4,即执行SUB R1,PC,#4时,PC应该指向当前地址的下2条地址,也就是指向了LDR R0,[R0],但是PC-4后就指向了STR PC,[R0]这个地址;
(2)将PC中的地址值,使用STR这个命令保存到R0寄存器中存放的那个值指向的地址中去,注意,此时的保存起来的这个值就是不确定的那个值,要么是当前的PC值+8,要么是当前的PC+12,谁让使用了STR了呢。
(3)将这个值取回放进R0寄存器里,为了下一步的减法计算用;
(4)用R0中的值减去R1中的值就是那个不确定的偏移量的值,然后再给他保存在R0中,谁爱用谁去用。

 

标签:R15,R0,R1,偏移量,PC,地址,指令,STR,ARM
来源: https://www.cnblogs.com/edwardliu2000/p/15013810.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有