我刚刚开始研究 Raspberry Pi 上的 ARM 程序集(任何指向好的文档的链接都会在评论中得到赞赏)
我有一个使用以下命令编译到汇编程序的 C++ 程序
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 可以在不重置其状态的情况下使用,所以我猜对于小功能,这更有效?