Texto en línea del ensamblador ATmega328P y ensamblador ALIGN

Tengo un programa en ensamblador como este:

        lots of code
        ......

.ORG $7000 ;;  (or somewhere) 

atext:   .DB    "this is a test string 1"

         .ALIGN EVEN    

Btext:   .DB    "this is a test string 2"
  1. PREGUNTA: Suponiendo que la longitud del texto 1 es IMPAR, ¿es posible ALINEAR Btexto usando algún tipo de comando ALIGN (como arriba). El Ensamblador Atmel (estudio 6.2) dice NO - pero me pregunto...

(Problema resuelto fácilmente mediante una alineación manual como esta:

atext:   .DB    "this is a test string 1",0,0
   //            01234567890123456789012  3 4      

Y agregando ceros donde sea necesario para alinear.

  1. PREGUNTA :

Ahora quiero escribir el texto en mi monitor serie.

Así que hago esto;

      ldi zh,High (text1)
      ldi zl,LOW (text1)
      push ZH 
      push ZL 
      lsl ZL  
      rol ZH  ;; to ensure LPM later 

WRTE: lpm R16,Z+ ; get byte/data 
      cpi R16,0  
      breq wrte2 
      call output
      rjmp wrte 
wrte2: 

      pop zl
      pop zh
      ret 

Ahora me pregunto: si uso

      ......       
WRTE: LD   R16,Z+      ; get byte/data /// BAD - DON'T 

  .....

¿Qué obtendré en R16?

Tenga en cuenta que Z indexa la memoria del programa como bytes. El ensamblador se asegurará de que los códigos de operación de las instrucciones estén alineados, pero para los datos no importa.
Gracias por alinear mis ejemplos de código: algo salió terriblemente mal mientras escribía. Kris
¿Qué quieres alinear Btext también, par, impar o algo más? ¿Por qué? Creo que @Jon ha respondido a su pregunta: la alineación de los datos no importa, ya que los datos son direccionables por bytes. ¿Quizás Jon debería promover el comentario a una respuesta?

Respuestas (1)

  1. La memoria del programa tiene 16 bits de ancho y el bus de direcciones del programa hace referencia a palabras, no a bytes, por lo que, por ejemplo, la dirección de PC 1 es la segunda PALABRA en la memoria del programa. El bus de direcciones de la memoria del programa no puede seleccionar bytes individuales dentro de una palabra.

.dbcoloca automáticamente el texto en una dirección 'par' (rellenando la cadena con un cero si es necesario) porque el equivalente en bytes de todas las direcciones de memoria del programa es par (la dirección real puede ser par o impar, según la PALABRA a la que se haga referencia). Por lo tanto, no hay necesidad de una directiva 'ALIGN EVEN'.

La instrucción LPM enruta los bits 15-1 del registro Z a los bits de dirección de memoria del programa 14-0 (haciendo referencia a hasta 32k palabras o 64k bytes), y el bit 0 se usa para seleccionar el byte inferior o superior en la palabra. Por eso hay que multiplicar la dirección del programa por 2 al ponerlo en el registro Z.

  1. La memoria de programa (ROM) y la memoria de datos (RAM) están en buses separados. Si usa una instrucción LD regular, accederá a la memoria de DATOS (no a la memoria de programa) y leerá el contenido de la RAM en esa dirección. La RAM tiene 8 bits de ancho y está direccionada en bytes, por lo que la dirección a la que se accede será exactamente la que está en el registro Z.
Muchas gracias por los comentarios. El 2º párrafo (comenzando con .db automáticamente .. ) no lo sabía. Eso responde completamente a mi primera pregunta. Mi pensamiento sobre la segunda pregunta fue: