这实际上是一个考试问题,我有疑问,我需要知道正确的答案和解释。
常见问题1和2。
INSTRUCTION INSTRUCTION SIZE (word)
MOV R1 LOC1 2
MOV R2 #01 1
ADD R1 R2 1
MOV LOC2,R1 2
Halt 1
Q1。考虑到存储器是字节可寻址的,大小为32位,并且程序已从存储器位置1000(十进制)开始加载。执行Halt指令后CPU停止,堆栈中保存的返回地址为
a)1007
b)1020
c)1024
d)1028
//我知道在执行任何指令期间,程序计数(PC寄存器)递增。因此,当执行暂停指令时,PC值应为1028但正确的是c),我不确定。请帮助找到正确的答案。
Q2。如果CPU为32位,字可寻址,程序从起始地址1000加载。如果在ADD指令期间发生中断,则返回地址将被推送到堆栈。
a)1007
b)1004
c)1005
d)1016
答案 0 :(得分:2)
Q1的正确答案应为D. 1028.对于1024,中断控制再次进入HALT后将没有逃生路线。我不知道是否有任何处理器这样做。当然不是这里显示的x86架构: http://x86.renejeschke.de/html/file_module_x86_id_134.html
答案 1 :(得分:0)
对于问题1,我可以说如果不知道它是哪个CPU就无法回答。
对于Q2,我会说没关系。 CPU必须注意它保持一致状态,因此每条指令必须是原子的且不可中断的。
假设CPU几乎完成了指令并且已经分配了值。如果中断发生且地址在指令之前,它将被执行两次,这不应该发生,因为在这种情况下这会导致错误的代码。
因此,如果指令正在发生,CPU必须取消指令并且地址将在它之前,否则它必须完成指令并且地址将在它之后。无论哪种方式,你都不知道确切的时间,因此你不知道地址。
只有查看给定CPU的硬件参考手册,才能确定答案。
答案 2 :(得分:0)
HALT指令是一个无条件分支inst,其目标地址与HALT inst本身相同。因此,当获取HALT inst时,PC将被更新为包含1028但是在执行HALT inst期间,PC将再次更新(因为HALT是无条件分支inst)到1024.随着执行完成,PC的当前值即1024被推入堆栈。 因此(C)是正确的选择。
答案 3 :(得分:0)
它取决于所讨论的内容,
如果在 HALT 指令期间有问题,则PC值是下一个指令地址,因为PC值始终是下一条指令。 但
如果在执行 HALT 指令后有问题,那么PC值是 HALT 指令起始地址,因为在成功执行HALT指令后我们知道没有下一条指令,所以PC值用HALT指令起始地址覆盖,然后编译器用退出点返回该地址。