【发布时间】:2014-07-24 01:31:20
【问题描述】:
我正在尝试编写一个模拟 ARM 二进制文件执行的 C 程序。 所以它现在做了什么,我们从二进制文件中获取指令到一个 uint32_t 数组中,然后我对其进行解码并执行。
问题是我只使用程序计数器来访问数组中的整数,然后我将其递增。但是对于带偏移量、将其扩展到 32 位并将其添加到 PC 的分支指令,PC 应该比正在执行的指令提前 8 个字节。 所以应该会产生管道效应。基本上就是:
- 从内存中取出 32 位(4 字节)指令
- 指令被解码
- 已执行解码指令
因此,当指令在流水线的顶部执行时,正在获取的指令是内存中的两条指令。因此 PC 比正在执行的指令的地址大 8 个字节。
有人知道如何轻松实现该管道吗? 我想我需要为指令重做内存存储,因为它现在只是一个固定大小的数组。 我的想法是对齐内存,然后在每条指令之后将 4 添加到 PC,并通过使用指向数组中第一个元素的指针并将 PC 添加到其中来访问下一条指令。如果这行得通,有人可以告诉我那会是什么样子吗?
【问题讨论】:
-
不太确定您是否真的需要在模拟器中使用管道 - 除非它是一个周期精确的模拟器。
-
如果你愿意,你可以准确地模拟管道,但我认为这对于解决这个特定问题没有必要。我在多年前编写的 ARM (v5) 仿真器中所做的类似于
instruction = read_word(r15); r15 += 8; decode_and_execute(instruction); r15 -= 4; // point to next instruction。 (所有其他修改r15的代码都必须考虑到每条指令后面都有一个减法) -
除非你需要自己实现,否则试试qemu