代码的访问次数是多少:
MOV R1, R0
STR R4,[R1,#4]!
LDR R3,[R1]
R1-R4 均为 32 位。
答案是五个,我真的很困惑。有人能帮我吗? 到目前为止,我知道 MOV 不需要内存访问,我的猜测是 STR 需要两个,LDR 需要一个。 STR访问R1和R1+4的内存;而LDR则访问R1的内存。但我认为这不是正确的解释,而且我不知道哪些操作导致了额外的 2 次内存访问。任何帮助将不胜感激!
这也许是那些不好的问题之一,我们不在你们的学校或班级里,不知道他们在说什么和没有说什么。也许从一本/某些教科书的角度来看,我们可以这样看。
MOV R1, R0
STR R4,[R1,#4]!
显然这是一篇文章。一次访问
LDR R3,[R1]
显然这是一篇读物。
这给了我们两个。
现在处理器实现可以(不必)使用“寄存器文件”。实现寄存器的 sram。 SRAM 是内存。
所以让我们从这个角度来看。
MOV R1, R0
这是两次访问,一次读取获取 r0,一次写入存储 r1(寄存器文件)
STR R4,[R1,#4]!
这是三个:从寄存器文件中读取 r1、从寄存器文件中读取 r4 以及向内存位置写入。
LDR R3,[R1]
这也是三个。从寄存器文件读取、从内存位置读取以及向寄存器文件写入。
所以你最终得到了八个。
MOV R1, R0
STR R4,[R1,#4]!
LDR R3,[R1]
因此,如果我们想象一些奇妙的魔法处理器,我们会看到 r1 执行所有这些操作,所以也许幻想的是 r1 不是从寄存器文件中获取的。是的,这是一个“可能”的实现。
假设从 MOV 的寄存器文件中读取一次,但 r1 不在寄存器文件 (1) 中。然后对于 STR,我们得到一个用于读取 r4 的值和一个用于写入/存储的值 (2)。然后,我们将 LDR 的 r3 存储到寄存器文件 (1) 中。那是四个。然后,如果我们最终将 r1 写入寄存器文件,这将是第五个。
你在那里,已经太晚了,但这是我建议你思考学校/项目以及他们所教授的内容的主题之一。您未向我们提供的大量信息可能表明这是一个具有固定答案的有效问题。脱离上下文,事实并非如此。几十年来,所有的arm实现都有很多方法和时间。这些实现可以有寄存器文件,不能有寄存器文件,可以有某种基于非寄存器文件的寄存器,这些寄存器在一种奇特的优化中将信息从一条指令传送到另一条指令。
没有理由认为我得到了正确的答案,只有你和你的同学知道,或者也许除了老师之外没有人知道。如果这是一个你不能去问老师的节目...那么...再次...