再补充解释一下,$r22
是栈指针,你也可以把它写成 $sp
。在这个程序中,因为 i
,a
,b
,c
都是局部变量,而且没有开优化,它们都要存到栈上 (而且是每对它们进行一个读取或写入都要落到栈上,不开优化就是这样的),所以就会生成很多用栈指针加上一个偏移去算栈上局部变量地址和读取/写入局部变量的代码。
如果你开了优化的话最后那个循环就会被编译成
.L4:
ldptr.w $r6,$r23,0
ldptr.w $r12,$r24,0
la.local $r5,.LC0
addi.w $r4,$r0,1 # 0x1
add.w $r6,$r6,$r12
addi.d $r23,$r23,4
bl %plt(__printf_chk)
addi.d $r24,$r24,4
bne $r23,$r25,.L4
这样看上去就清楚很多,$r23
和 $r24
分别存放了当前要读取的 a[i]
和 b[i]
的地址,而 c
这个数组直接被优化没了,所以没有写入 c[i]
对应的代码。