Estoy confundido sobre lo que sucede durante POP. Cuando POP LR
sucede, cambia el PC
a la ubicación de LR
, que sería sumi
. Si lo devuelve a sumi
, ¿no sería eso simplemente llevar la recursión aún más lejos?
c ++:
int sumi(int n) {
if(n == 0)
return 0;
else
return n+sumi(n-1);
}
montaje:
sumi:
CMP R2,#0 ; n is R2
BNE else
then:
MOV R0,#0 ; result in R0
BX LR
else:
PUSH LR
PUSH R2
SUB R2,R2,#1
BL sumi
POP R2
ADD R0,R2,R0
POP LR
BX LR