我有一个小程序,我试图用它来以编程方式识别 CPU 频率。
我的程序结构如下:
- 设置闹钟
while(1)
循环递增寄存器- 计算速度
SIGALRM
最初,我正在使用
register unsigned int cycles asm("r6");
...
while(1)
cycles++;
使用 objdump 后,我注意到这实际上转换为以下内容:
9aa0: e1a03006 mov r3, r6
9aa4: e2833001 add r3, r3, #1
9aa8: e1a06003 mov r6, r3
9aac: eafffffb b 9aa0 <estimate_from_cycles+0x1cc>
由于我不确定为什么将其翻译为 3 条指令,因此我尝试使用内联汇编来代替:
register unsigned int cycles asm("r6");
...
while(1)
asm("add r6, r6, #1);
这翻译成:
9aa0: e2866001 add r6, r6, #1
9aa4: eafffffd b 9aa0 <estimate_from_cycles+0x1cc>
- 为什么之前的实现翻译成 3 条指令?
- 在 ARM 平台上,
b <label>
指令需要 3 个周期。但是,ARM 上的减法运算仅使用 1 个周期。- 有什么办法可以从 PC 寄存器中减去吗?
- PC上是否允许减法?
- 有没有其他方法可以减少实现相同逻辑所需的周期数?
编辑:我正在使用 CodeSourcery 的 arm-none-linux-gnueabi- 工具链,没有优化