código de inicialización AVR-GCC

1

Considera el siguiente asm.S

.global main
main:
rjmp main

Compile y voltee con estos comandos:

avr-gcc -mmcu=atmega32u4 -g -o asm.elf asm.S
avr-objdump -S asm.elf

En el código de inicialización, entre otros, existe este comando:

ae: 1f be           out 0x3f, r1    ; 63

¿Por qué hay este comando?

    
pregunta Igor Liferenko

1 respuesta

3

La secuencia de inicialización completa que veo es:

__ctors_end:
  eor   r1, r1
  out   0x3f, r1
  ldi   r28, 0xFF
  ldi   r29, 0x0A
  out   0x3e, r29
  out   0x3d, r28
  call  main
  jmp   _exit

Desglosándolo:

  eor   r1, r1
  out   0x3f, r1

El registro 0x3f es SREG: el registro de estado, que contiene bits de estado como N, Z y C, así como el bit de habilitación de interrupción. Este código borra el registro. El registro ya debería estar borrado en el reinicio, pero un cargador de arranque o un reinicio parcial del software pueden haberlo dejado en un estado inconsistente.

  ldi   r28, 0xFF
  ldi   r29, 0x0A
  out   0x3e, r29
  out   0x3d, r28

Los puertos 0x3d y 0x3e son las partes altas y bajas del puntero de pila. Este código inicializa el puntero de pila a 0x0AFF, en la parte superior de la RAM. Esto es, nuevamente, idéntico al estado de reinicio del procesador, por lo que es más una precaución que una necesidad.

  call  main
  jmp   _exit

Esto llama a tu función main , luego salta a _exit (un bucle infinito) en caso de que main devuelva.

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas