首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

arm的PC指针指向何方

长假开始了,玩归玩,每天还是要坚持学习,今天跟大家介绍arm的PC指针的指向问题。阅读时间:5分钟。

PC指针在arm里是指PC寄存器,也就是R15,第15号寄存器,PC只不过是别名。在程序执行的时候,PC到底指向哪里,很多人应该都不清楚。今天在网上看了几篇博客,写得很好,我做了整理,和大家分享下。

在计算机体系结构中,PC值(program counter)表示下一条指令存储的地址。在ARM中也是。不过由于ARM采用流水线来提高CPU利用效率,所以无论是ARM7中的3级流水线还是ARM9中的5级流水线,如果当前指令在执行,那么下一条指令一定正在译码,再下一条指令正在读取,PC值实际上是正在读取的指令的地址。

首先我们来解下arm7的3级流水线。

3级流水线就是指一条指令的执行需要三个步骤。从图中可以看出,一条汇编指令的运行有三个步骤,取指、译码、执行,当第一条汇编指令取指完成后,开始解码时,也开始了第二条指令的取指,第一条指令解码结束开始运行时,开始了第三条指令的取指。

由前面的定义知,PC始终指向当前取出的指令的地址,一般来说,人们习惯性约定将“正在执行的指令作为参考点“,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8。

ARM7的三条流水线,PC=当前程序执行位置+8,很好理解,但是AMR9中,是五级流水线,为何还是PC=当前程序执行位置+8,而不是PC=当前程序执行位置+(5-1)*4=当前程序执行位置+ 16呢?大家可以先看下arm的五级流水线图:

下面就需要好好解释一番了。

其实,PC=当前程序执行位置+8和几级流水线并没有关系,而是和指令运行阶段处于流水线的哪个阶段有关。即使你是5级流水线,只要指令运行阶段还是处于流水线的第三阶段,那么PC还是等于当前程序执行位置+8。

有网友推出这样的结论:

假设,Execute阶段处于流水线中的第E阶段,每条指令是T个字节,那么 PC= PC + N*T PC= PC + (E - 1) * T。

可能是为了统一,我发现ARMv7架构PC也就是等于当前执行位置+8。不信我以一个汇编程序的反汇编结果为证。

start.S如下:

adr r0,main_loop指令是将main_loop运行时的地址送入r。反汇编的结果是将PC减4送给r0。因为main_loop的地址等于程序当前地址+4,而PC等于程序当前地址+8。所以main_loop的地址等于PC-4。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191001A0EWYO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券