机器指令和内存地址

时间:2013-05-16 21:27:26

标签: memory assembly cpu cpu-registers

这实际上是一个考试问题,我有疑问,我需要知道正确的答案和解释。

常见问题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

4 个答案:

答案 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指令起始地址覆盖,然后编译器用退出点返回该地址。