ensamblador ATmega328P texto en línea y ensamblador ALIGN

1

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 ODD- ¿Es posible ALINEAR Btext usando algún comando del comando ALIGN (como arriba)? El ensamblador Atmel (studío 6.2) dice que NO, pero me pregunto ...

(El problema se resuelve fácilmente mediante una alineación manual como esta:

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

Y añadiendo ceros donde sea necesario para alinear.

  1. PREGUNTA:

Ahora quiero escribir el texto en mi monitor de 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?

    
pregunta KRIS-Norway

1 respuesta

1
  1. La memoria del programa tiene 16 bits de ancho y el bus de dirección 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.

.db coloca automáticamente el texto en una dirección "par" (rellena la cadena con un cero si es necesario) porque el Byte equivalente de todas las direcciones de memoria del programa es par (la dirección real puede ser impar o par, dependiendo de cuál Se está haciendo referencia a WORD). Por lo tanto, no hay necesidad de una directiva 'ALIGN EVEN'.

La instrucción LPM enruta los bits 15-1 del registro Z para programar los bits de dirección 14-0 (haciendo referencia a palabras de 32k o 64k bytes), y el bit 0 se usa para seleccionar el byte inferior o superior en la palabra. Es por eso que tiene que multiplicar la dirección del programa por 2 al ponerla 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 del programa) y leerá el contenido de la RAM en esa dirección. La memoria RAM tiene 8 bits de ancho y está direccionada en bytes, por lo que la dirección a la que se accede será exactamente lo que se encuentra en el registro Z.
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas