C 语言和 ARM 汇编 - 4 计算表达式

让我们看看计算表达式转换成汇编的例子。

int a = 2;
int b= 3;
int c = 24;
a = a + b;
a = a + b * c;

对应的汇编代码,其中局部变量对应的堆栈位置

a -> sp + 12
b -> sp + 8
c -> sp + 4

sub sp, sp, #16
# a = 2
movs    r3, #2
str r3, [sp, #12]
# b = 3
movs    r3, #3
str r3, [sp, #8]
# c = 24
movs    r3, #24
str r3, [sp, #4]
# a = a + b
ldr r2, [sp, #12]
ldr r3, [sp, #8]
add r3, r3, r2
str r3, [sp, #12]
# a = a+b*c
ldr r3, [sp, #8]
ldr r2, [sp, #4]
mul r3, r2, r3
ldr r2, [sp, #12]
add r3, r3, r2
str r3, [sp, #12]
add sp, sp, #16
@ sp needed
bx  lr

计算过程都是在寄存器上面处理的,基本过程都是将数据加载到寄存器,然后通过寄存器上面的计算操作将变量缓存在寄存器,然后通过 str 指令将计算结果返回堆栈(局部变量)。

这个过程看似很繁琐,但保持了 RISC 指令长度的同时,确保了每个指令能在一个指令周期完成,便于流水线优化处理。