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"
(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.
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?
.db
coloca 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.
Jon
KRIS-Noruega
gbulmer
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?