1 votos

ATmega328P ensamblador en línea de texto y ensamblador ALIGN

Tengo un programa en ensamblador como este:

        montones de código
        ......

.ORG $7000 ;;  (o en algún lugar) 

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 Btext usando algún tipo de comando ALIGN (como arriba)? El ensamblador de Atmel (studio 6.2) dice NO, pero me pregunto....

(Problema fácilmente resuelto mediante 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 serie.

Entonces hago esto;

      ldi zh,High (texto1)
      ldi zl,LOW (texto1)
      push ZH 
      push ZL 
      lsl ZL  
      rol ZH  ;; para asegurar LPM luego 

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

      pop zl
      pop zh
      ret 

Ahora me pregunto: Si uso

      ......       
WRTE: LD   R16,Z+      ; obtener byte/dato /// MAL - NO 

  .....

¿Qué obtendré en R16?

1voto

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

.db automáticamente coloca el texto en una dirección 'par' (rellenando la cadena con un cero si es necesario) porque el equivalente de Byte de todas las direcciones de la memoria del programa es par (la dirección real puede ser impar o par, dependiendo de la PALABRA que se esté referenciando). Por lo tanto, no es necesario un directiva 'ALIGN EVEN'.

La instrucción LPM enruta los bits 15-1 del registro Z a los bits de dirección de la memoria del programa 14-0 (hasta 32k Palabras o 64k Bytes), y el bit 0 se utiliza para seleccionar el Byte inferior o superior en la palabra. Por eso tienes que multiplicar por 2 la dirección del programa al ponerla en el registro Z.

  1. La memoria del programa (ROM) y la memoria de datos (RAM) están en buses separados. Si usas 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 RAM tiene 8 bits de ancho y se direcciona en Bytes, por lo que la dirección accesada será exactamente lo que está en el registro Z.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X