【发布时间】:2014-03-24 23:08:33
【问题描述】:
让我们用一个简单的 C 代码来设置一个寄存器:
int main()
{
int *a = (int*)111111;
*a = 0x1000;
return 0;
}
当我使用 1 级优化为 ARM (arm-none-eabi-gcc) 编译此代码时,汇编代码类似于:
mov r2, #4096
mov r3, #110592
str r2, [r3, #519]
mov r0, #0
bx lr
看起来地址 111111 被解析到最近的 4K 边界 (110592) 并移动到 r3,然后通过将 519 与 110592 (=111111) 相加来存储值 4096(0x1000)。为什么会这样?
在 x86 中,组装很简单:
movl $4096, 111111
movl $0, %eax
ret
【问题讨论】:
-
我想提醒您不要根据生成的汇编指令的数量来评估这些架构。不同的汇编指令的数量并不能告诉您使用了多少 字节 代码,也不能告诉您任何有关执行时间的信息。 x86 ISA 是在人类仍然进行大量汇编编码的时代设计的,因此即使在其他方面效率低下,拥有“直截了当”的指令也很重要。
-
x86 使用可变字长指令,因此您可以使用任何 32 位或 64 位立即数的单条指令。 Arm 是固定指令长度,因此您不能立即获得任何 32 或 64 位,它需要多个指令和/或它需要具有该值的位置的 pc 相对负载。编译器将选择一个或另一个选项。
标签: gcc assembly compiler-construction x86 arm