【发布时间】:2013-06-21 10:10:57
【问题描述】:
我刚刚开始研究 Raspberry Pi 上的 ARM 程序集(任何指向优秀文档的链接都会在 cmets 中得到赞赏)
我有一个 C++ 程序,我使用以下命令编译到 Assembler
g++ -S -fverbose-asm -march=armv6j -mtune=arm1176jzf-s file.cpp
然后我可以检查 file.s,这很好,而且有点道理。但是我认为 ARM 芯片有 15 个通用寄存器我对这段代码的阅读是它只使用 r1 - r3
mov r3, r3, asl #1 @ tmp166, tmp166,
add r3, r3, r2 @ tmp166, tmp166, D.24883
mov r2, r3, asl #3 @ tmp167, tmp166,
add r3, r3, r2 @ tmp166, tmp166, tmp167
rsb r2, r3, r1 @ D.24883, tmp166, tmp161
我在生成的代码中看不到出现高于 r3 的寄存器。有什么我从根本上理解的吗?这有充分的理由吗?还是生成的代码不是最优的?
更新
- 如果我用
-O2编译它确实使用了更多的寄存器,所以我假设这是GCC 选择做的事情。不太清楚为什么或哪个开关控制此行为。 - 我还读到 r1 -r4 可以在不重置其状态的情况下使用,所以我猜对于小函数来说这更有效?
【问题讨论】:
标签: assembly arm raspberry-pi