assembly 我可以强制Cortex-M4 ARM处理器使用IT模块外的条件指令吗?

rxztt3cl  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(209)

我需要为一个项目分析不同的机器指令,所以我在一个每次大约200条指令的循环中运行一些指令(在__asm__指令中使用.rept)。我使用的处理器是ARM Cortex-M4。我现在需要测试ARM的条件指令。如果我输入类似

".rept 200\n\t"
        "addeq r1, r1, r1\n\t"
        ".endr\n\t"

我得到

Error: thumb conditional instruction should be in IT block -- `addeq r1,r1,r1'

现在,IT块最多可以有4条指令,所以我能用它们做的最好的事情是

".rept 200\n\t"
        "ITTTT EQ\n\t"
        ".rept 4\n\t"
        "addeq r1, r1, r1\n\t"
        ".endr\n\t"
        ".endr\n\t"

产生二进制类

80003ae:   bf01        itttt   eq
 80003b0:   1849        addeq   r1, r1, r1
 80003b2:   1849        addeq   r1, r1, r1
 80003b4:   1849        addeq   r1, r1, r1
 80003b6:   1849        addeq   r1, r1, r1

但是,这样一来,五分之一的指令就不是我想要评测的指令(在我采取的措施中会产生一些干扰)。因为我听说IT块是由Thumb-2 ISA强制执行的,而且整个ARM即使没有条件指令也可以使用,所以我的问题是:* * 我可以指示汇编程序使用它们吗?**此外,如果我没有听错,Thumb-2 * 需要 * 它们,是否有办法进一步减少"噪音"?(优于1/5指令?)
谢谢!

    • 编辑:**我得到了很多有用的评论(谢谢!),但我意识到我错过了一些重要信息,无法更好地理解我的目标,我为此道歉。我正在尝试分析CPU的"功耗",因此IT块是否"执行"实际上会产生差异,这是产生的二进制编码等,而所需的时钟周期不是这里的重点。

我认为这意味着(如果我错了请纠正我),即使Thumb-2巧妙地隐藏了IT块的复杂性,我应该看到一个功率差异,万用表在手。

jhkqcmku

jhkqcmku1#

IT指令使后续指令成为条件指令。你会发现,如果你删除它,指令就变成无条件指令。这就是指令编码的工作原理。你可以把IT块看作一个或多个指令的前缀,修改它们的行为,可能不再设置标志,而是有条件地执行。如果你删除前缀,执行就不再是有条件的。
对于基准测试,我会使用IT块,每个块有一条指令,因为这是最常见的用例。一些ARM处理器有一个解码器,专门支持这种情况,在通常情况下,将IT指令和后续的条件指令作为一条来解析。
另一方面,Cortex-M4还具有其他功能:如果前一条指令(!)是16位指令,则IT指令将合并到其中,并在零周期内有效执行。这至少可以解决测量16位条件执行的情况下的测量问题。
你可以做的另一件事是用不同大小的IT块运行基准测试,然后使用算术计算IT指令花费的时间。然后你可以从总运行时间中删除该时间。一般来说,有条件执行的指令与无条件执行的指令花费的时间相同,尽管可能有例外(例如,控制转移指令或通过其他方式写入PC的指令)。

相关问题