在按字节编址的计算机中,一条指令长16位,当前分支转移指令(采用相对寻址)地址为3000,指令地址的偏移量为—5,当执行完此转移指令后,PC的值为( )。

admin2019-03-15  23

问题 在按字节编址的计算机中,一条指令长16位,当前分支转移指令(采用相对寻址)地址为3000,指令地址的偏移量为—5,当执行完此转移指令后,PC的值为(    )。

选项 A、2996
B、2997
C、3001
D、3002

答案B

解析 首先给出解答步骤,当前指令地址为3000,取完这条指令后,PC的值增加一个指令字长度,即3002,加上偏移量—5,所以执行完这条指令后,目标地址为2997,然后将这个值覆盖到PC当中。
总结:这里面存在两个问题:1)PC值到底如何计算?2)得出的目标地址到底放哪里?
这是一个当年困扰笔者和很多考生的一个很典型的问题,PC到底是多少呢?“然后PC=PC+1”,老师经常这么说。可是这里的“1”到底怎么理解?一个字节?一个指令字?你先别急着回答,笔者翻阅了很多书籍,也参考了各大院校的自主命题以及408统考真题,发现理解各不一样,拿北京理工大学2005年的一个选择题为例(在按字节编址的计算机中,一条指令长16位……,然后取完指令后,PC的值是多少?),这里参考答案把加1理解成了1个字节。在2009年408真题当中同样类型的题目(指令字长16位,按字节编址),题于给出的却是每取出一个字节,PC+1,那么取完这条指令时,PC的值便自增了2,也就是说在我们熟悉的那句话“当取出一条指令后,PC的值就+1”中,这里的1便是1个指令字的长度。在考试当中我们怎么理解?当然是按真题的讲解,一切以得分为目标,也就是说以后遇到这样的题,就把这里的1理解为一个指令字。
得到的目标地址后不要以为就拿这个地址去寻址去了,记住,所有的取指令的地址都是从PC传到MAR中然后去寻址的,也就是说得到目标地址后还要把这个地址覆盖到PC当中。
终于讲解完毕了,对于考试来说也就够了,可是你真的觉得这就算完了吗?远不是这样,以上的理解都是片面的。
(1) PC自增1的情况指出现在无流水(non—pipeline)的情况下,这个时候取指,译码,执指都是顺序执行的。而在有流水的情况下就比较复杂了,这里用arm7的三级流水线为例。
流水线使用三个阶段,因此指令分为三个阶段执行:
1)取指(从存储器装载一条指令);
2)译码(识别将要被执行的指令);
3)执行(处理指令并将结果写回寄存器)。
而R15 (PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8。
(2)程序计数器值的修改分两种情况:一是顺序执行指令的情况,二是分支转移指令的执行情况。当顺序执行指令时,程序计数器值的修改较为简单。若当前取得的指令是单字节指令,即将程序计数器的值加1(PC+1→PC);若当前取得的指令是双字节指令,即将程序计数器的值加2(相当于加了一个指令字长度)……;在执行分支转移指令时,由分支转移指令的寻址方式确定下一条指令在主存中的地址。若分支转移指令的寻址方式是相对寻址,那么程序计数器的值修改为当前地址加上相对偏移量;若分支转移指令的寻址方式是绝对寻址,即将转移指令中绝对转移地址送给程序计数器;当是间接寻址方式的分支转移指令时,程序计数器的值从指令指定的寄存器或主存存储单元中提取。
转载请注明原文地址:https://kaotiyun.com/show/aICi777K
0

最新回复(0)