【问题标题】:QEMU Branch and Exchange (arm thumb) instruction doesn't get called未调用 QEMU 分支和交换(手臂拇指)指令
【发布时间】:2018-09-22 02:13:48
【问题描述】:

所以我在带有 QEMU 后端的 arm 模拟器中测试更改,并且我的微基准测试没有被触发分支和交换指令。

我关心的特定块: https://github.com/qemu/qemu/blob/19b599f7664b2ebfd0f405fb79c14dd241557452/target/arm/translate.c#L11748

无论如何,我想我会先手动检查这些位

所以:

insn = (0b010001 << 10)

将等于: 100010000000000

所以如果那是命中 switch 语句:

 switch (insn >> 12)

我们会得到:4。到目前为止一切顺利。

我们首先检查if (insn &amp; (1 &lt;&lt; 11)) 那是 0 仍然很好,我们继续下一个条件 if (insn &amp; (1 &lt;&lt; 10)) 返回 1024,所以我们选择了分支。 这就是事情开始变得棘手的地方。

我们这样做

op = (insn >> 8) & 3;
switch (op)

分支交换代码在案例 3 中 但(0b100010000000000 &gt;&gt; 8) &amp; 3 将是 0: 为了更清楚0b1000100 &amp; 0b11根本不排队。

我在这里缺少什么?这是一个错误吗?

【问题讨论】:

  • 我不太清楚你在问什么。你从哪里得到insn = (0b010001 &lt;&lt; 10) 输入?是什么让您认为错误出在您链接到的代码中,而不是微基准测试中(那是您的代码,qemu 的一部分)?

标签: qemu thumb


【解决方案1】:

0100010000000000(即 0b010001

您可以通过查看 v7A Arm ARM(DDI0406C.c,可在 https://developer.arm.com/docs/ddi0406/c/arm-architecture-reference-manual-armv7-a-and-armv7-r-edition 获得)来确认这一点,尤其是 A6.2 节中的解码表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多