Cómo entender la inicialización y la verificación de la pila del lenguaje ensamblador ARM [cerrado]

0

Estoy tratando de entender lo malo que es un 'void main (void)' desde el siguiente enlace: notas técnicas . Pero tengo dificultades para entender dos ejemplos de lenguajes de ensamblador, el primero se muestra a continuación:

int main(void)
{
 return 42;
}

|main|:
       mov ip,sp
       stmfd sp!,{rfp, fp, ip, lr, pc}
       sub fp,ip,#4
       cmps sp,sl
       bllt |x$stack_overflow|
       bl   |__main|
       mov r0,#42
       ldmdb fp,{rfp,fp,sp,pc}^

He encontrado algunas explicaciones en Manual de referencia de nivel de aplicación de arquitectura ARM v7-M . así que sé que stmfd es como PUSH aquí. Pero todavía tengo muchas preguntas.

  • ¿Por qué llamamos a las primeras seis instrucciones la inicialización y la verificación de la pila?
  • ¿Qué significan ip, rfp, fp y sl?
  • ¿Por qué sub 4?
  • ¿Qué es bllt? Acabo de encontrar bl en el manual de referencia
  • ¿De dónde viene 'x $ stack_overflow'?
  • ¿Por qué usa ldmdb?

Si me puede dar un tutorial o un manual de referencia sobre los lenguajes de ensamblaje ARM, estaré muy contento. Porque creo que hay otro ejemplo de lenguaje ensamblador más difícil de ese enlace.

    
pregunta oilpig

1 respuesta

2

La costumbre en este sitio web es hacer una pregunta por pregunta, pero trataré de responderlas todas.

  
  • ¿Por qué llamamos a las primeras seis instrucciones la inicialización y la verificación de la pila?
  •   

Porque eso es lo que hacen. Estas instrucciones son instadas por el compilador, no son causadas por las declaraciones de nivel C en el main () que escribió el usuario.

  
  • ¿Qué significa ip rfp fp sl?
  •   

Busca los alias (nombres alternativos) para los registros que tienen un propósito específico.

  
  • ¿Por qué sub 4?
  •   

Para hacer espacio en la pila para algo que no está usando. Parece una oportunidad perdida para el optimizador :(

  
  • ¿Qué es bllt? Acabo de encontrar bl en el manual de referencia
  •   

Es una condición: en estos chips ARM CUALQUIER instrucción puede ser condicional. En este caso, es rama-y-enlace-iff-menor que.

  
  • ¿De dónde viene 'x $ stack_overflow'?
  •   

Es suministrado por la biblioteca de tiempo de ejecución, y se llama cuando la pila está (a punto de ser) superada.

  
  • ¿por qué usa ldmdb?
  •   

que es la instrucción load-multiple-registers-from-a-full-decending-stack. en otras palabras: pop.

PS: para el software de microcontrolador de metal desnudo, escribo principalmente el requisito de que main() debe devolver un int es un PITA real. No hay un sistema operativo ni un script ni nada para volver, así que a quién le importa qué main() devuelve? main() debería ser un bucle infinito, pero el compilador insiste en un return 0; después de él. Y luego se queja de una declaración inalcanzable :(

    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas