gpt4 book ai didi

c - C 中的 ARM11 仿真器

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:25 26 4
gpt4 key购买 nike

我正在尝试编写一个 C 程序来模拟 ARM 二进制文件的执行。所以它现在所做的是,我们从二进制文件中获取指令到一个 uint32_t 数组中,然后我对其进行解码和执行。

问题是我只使用程序计数器访问数组中的整数,然后递增它。但是对于分支指令,它需要偏移量,将其扩展到 32 位并将其添加到 PC,PC 应该比正在执行的指令提前 8 个字节。所以管道效应应该发生。这基本上是:

  1. 从内存中取出32bit(4byte)的指令
  2. 指令被解码
  3. 执行解码指令

因此,当指令在流水线的顶部执行时,被提取的指令是内存中更远的两条指令。因此 PC 比正在执行的指令的地址大 8 个字节。

有人知道如何轻松实现该管道吗?我想我需要为指令重做我的内存存储,因为它现在只是一个固定大小的数组。我的想法是对齐内存,然后在每条指令后将 4 添加到 PC,并通过使用指向数组中第一个元素的指针并将 PC 添加到该元素来访问下一条指令。如果这行得通,有人可以告诉我那会是什么样子吗?

最佳答案

您不需要模拟管道。 ARM 已经有一段时间没有在硬件中使用 2-ahead 流水线了,他们也模拟了 2-ahead。

我所做的是在任何时候修改 pc 时保持 pc 领先,然后在获取时我在 pc-4 处获取然后添加 4。任何可以修改 pc 的指令都必须有一个 if pc then pc+= 4.当我计算一个分支 dest 时,我不得不再添加 4。我不知道为什么要这样做,我不知道。

或者,您可以让 pc 指向当前指令。每次读取 pc 时,您都会添加 8。这样可能更容易。我使用函数抽象了我的指令获取、内存读/写和寄存器读/写,并在 read_register() 函数中添加了 if r15 then result+=8;然后返回。

同样,我不记得为什么我不这样做了,我不得不破解它才能让它工作。现在现实是我的是拇指 (v1) 模拟器而不是 ARM 所以它是 +2 和 +4 而不是 +4 和 +8。并且根本没有 arm 模式(我的模拟器支持),所以只有一些拇指指令可以实际修改 pc,这样更容易只针对那些带有 if reg==15 的指令。

如果你真的想做一个 arm11 模拟器,你需要考虑 thumb 模式,然后处理 pc 是 4 超前还是 8 超前,并且记住在 thumb 模式修改时将 lsbit 从 pc 上剥离必须将 lsbit 设置为切换到或保持拇指模式的一些指令。幸运的是,arm11 不支持 thumb2 然后它变得非常丑陋,因为它是可变指令长度,你必须提前两条指令,而不仅仅是 4 或 8 个字节(可以提前 4、6 或 8 个字节,你必须解码接下来的两个在拇指模式中找出)。如果您不想支持拇指模式,您可以轻松地查找在 bx 或 pop 中设置的 lsbit,然后声明您不支持拇指模式并退出。

你的选择是模拟一个管道,或者你必须插入一个或一些 if reg==15 then... 代码行,你必须在任何使用 pc 的地方都这样做(将所有寄存器读取路由到一个函数是执行此操作的一种非常简单的方法)。我应该去修理我的模拟器来做到这一点。如果您最终支持拇指模式,那么您可以简单地说,如果处于拇指模式,则在此读取寄存器函数中添加 4,否则添加 8。

关于c - C 中的 ARM11 仿真器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24019818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com