Confusión en el pop para el código de ensamblaje recursivo

0

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
    
pregunta stumped

1 respuesta

0

La instrucción POP LR simplemente saca un valor de la pila y pone ese valor en LR. Pero junto con la siguiente instrucción, BX LR, saca un valor de la pila y lo pone en la PC. En otras arquitecturas, esa acción se llamaría RET o RETURN.

Para una sola llamada a sumi (n == 0) la pila no se utiliza: el BX LR provoca el retorno a la instrucción después de la llamada a sumi.

Para una llamada recursiva, el PUSH LR primero empuja el valor LR en la pila, luego ocurre la llamada recursiva, después de lo cual el valor LR se restaura y se copia al PC mediante POP LR; BX LR.

Nota: si no sabes cuál es el papel de las llamadas de subrutina LR en ARR, definitivamente tendrás que estudiar eso.

    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas