AVR: etiqueta de multiplicación ASM con 2

1

En el ejemplo a continuación :

ldi ZL, low(2*label)
ldi ZH, high(2*label)

label:
.db "Hello world", 0
lpm

¿Por qué se necesita la etiqueta de multiplicación con 2? Entiendo que la memoria del programa está direccionada por palabras, y supongo que la etiqueta: ¡tiene una longitud de 16 bits (!?).

Aquí hay un texto citado del autor del ejemplo:

  

"Si la dirección no se multiplica por dos y la etiqueta está en la dirección de byte 0x60 (dirección de palabra 0x30), Z apuntará al código almacenado allí. Espero que esto aclare el problema de direccionamiento. Otras versiones son ..."

Puedes aclarar.

    
pregunta Zippi

1 respuesta

3

Las ubicaciones del ensamblador están direccionadas por palabra debido al hecho de que los códigos de operación AVR son de 16 bits, pero los registros de índice funcionan con las ubicaciones de bytes. La multiplicación por 2 aborda esta discrepancia.

EDIT:

De la descripción de la instrucción LPM (cargar memoria de programa) :

  

La memoria del programa está organizada en palabras de 16 bits, mientras que el puntero Z es una   dirección del byte. Por lo tanto, el bit menos significativo del puntero Z selecciona ya sea byte bajo (Z LSB = 0) o byte alto (Z LSB = 1).

Por lo tanto, si queremos leer la dirección de la memoria del programa 5, necesitamos cargar 10 en Z y luego leer dos bytes.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas