assembly - 我可以强制 Cortex-M4 ARM 处理器在 IT block 之外使用条件指令吗?

标签 assembly arm inline-assembly cortex-m thumb

我需要为项目分析不同的机器指令,因此我每次在大约 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 block 最多可以有 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 block 是由 Thumb-2 ISA 强制执行的,并且即使没有它们,完整的 ARM 也可以使用条件指令,所以我的问题是:我可以指示汇编器使用它们吗?此外,如果我没听错,Thumb-2 需要它们,有办法进一步减少“噪音”吗?(比 1/5 指令更好?)

谢谢!


编辑:我收到了很多有用的评论(谢谢!),但我意识到我错过了一些重要信息以更好地理解我的目标,对此我深表歉意。我正在尝试分析 CPU 的功耗,因此,如果 IT block “执行”与否(这是生成的二进制编码 ecc),那么它实际上会产生影响,而时钟周期需要的不是这里的重点。

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

最佳答案

IT 指令使后续指令成为有条件的。您会发现,如果将其删除,说明将变成无条件的。这就是指令编码的工作原理。您可以将 IT block 视为一个或多个指令的前缀,修改它们的行为以可能不再设置标志并有条件地执行。如果删除前缀,执行将不再有条件。

对于基准测试,我会使用 IT block ,每个 block 包含一条指令,因为这是最常见的用例。一些 ARM 处理器有专门支持这种情况的解码器,将 IT 指令和后续条件指令解析为通常情况下的一个。

另一方面,Cortex-M4 会执行其他操作:如果前面的指令 (!) 是 16 位指令,则 IT 指令将被折叠到其中并在零周期内有效执行。这至少可以解决你测量16位条件执行情况下的测量问题。

您可以做的另一件事是使用不同大小的 IT block 运行基准测试,然后使用算术来计算 IT 指令花费的时间。然后您可以从总运行时间中删除该时间。一般来说,条件执行指令与无条件指令花费相同的时间,尽管可能存在异常(exception)(例如,控制传输指令或通过其他方式写入 PC 的指令)。

关于assembly - 我可以强制 Cortex-M4 ARM 处理器在 IT block 之外使用条件指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75474394/

相关文章:

assembly - 汇编语言中的 or 和 ori 有什么区别?

Linux Booting Angel 开机

c - C程序中的ASM代码导致段错误

c - GCC 内联汇编——与 __volatile__ 和 "memory"有什么区别?

assembly - 为什么DCPU-16指令的二进制表示中有一个前导1

assembly - 如何使用emu8086读取硬件输入

assembly - 如何编写在非常接近系统启动时运行的软件?

gdb - 如何使用 JLink 和 Cortex M4 从 gdb 设置堆栈指针?

linux - 不支持配置arm-buildroot-linux-gnu

c - 我如何让 GCC 在 ah/bh/ch/dh 中放置一个字符?