关于PC值的计算的问题

来源:本站
导读:目前正在解读《关于PC值的计算的问题》的相关信息,《关于PC值的计算的问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《关于PC值的计算的问题》的详细说明。
简介:本文主要介绍了一下PC值的计算时遇到的问题及解决方法

关于PC值的计算的问题:

1、三级流水线:其实对于PC=PC+8这个问题很简单,这两个PC其实代表着不同的意义,第一个PC是对于CPU而言,而第二个PC而言是我们通过编译器看到的PC(PC指向程序正在运行的那一条指令),但是对于CPU的PC是永远指向取指那个步,故PC=PC+8。

2、五级流水线;ARM9流水线包括取指(fetch)、译码(decode)、执行(excute)、缓冲/数据(buffer/data)、回写(write-back)寄存器堆。ARM9流水线在译码阶段已经开始读取操作数寄存器,因此译码阶段的PC值和取指阶段的PC值关系为:PC(decode)=PC(fetch)+4。因此执行阶段的PC值和译码阶段的PC值关系为:PC(excute)=PC(decode)+4。

3、对于软中断函数的返回时的PC:如下

ARMThumb

SWIPC-8PC-4

xxx》PC-4PC-2(异常返回将执行这条指令)

yyyPCPC

因此返回指令为:MOVPC,LR

原因:异常是由指令本身引起的,因此内核在计算LR时的PC值并没有被更新。对于ARM状态,因为SWI指令表示将跳到异常处理函数,此时SWI这条指令的PC=PC-8,当进入异常处理函数之前,硬件会自动把PC-4保存到LR寄存器中,所以异常处理函数结束后直接MOVPC,LR就行,就会跳到xxx这一条指令去执行。对于Thumb状态同理。

4、对于IRQ和FIQ中断函数返回时的PC:

ARMThumb

xxxPC-12PC-6(程序在运行这条代码时就产生了中断信号)

yyy》PC-8PC-4(异常返回将执行这条指令)

zzzPC-4PC-2

wwwPCPC

返回指令为:SUBSPC,LR,#4

原因:异常在当前指令执行完成后才会被响应,因此内核在计算LR时的PC值已被更新。对于ARM状态,程序在执行xxx这条指令时,中断信号产生,但是由于中断必须在这一条指令执行完之后才会被响应,执行完后,则此时对于CPU的PC已经指向了www这条指令的取指,在中断函数函数时应该执行yyy这条指令,虽然硬件会把PC-4的值赋值给LR寄存器,但是这是指向zzz这条指令的,所以返回时应该SUBSPC,LR,#4。对于Thumb状态同理。

来源:http://blog.chinaunix.net/uid-29270628-id-4027215.html

提醒:《关于PC值的计算的问题》最后刷新时间 2024-03-14 01:01:03,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《关于PC值的计算的问题》该内容的真实性请自行鉴别。