Autor Tema: Cargar la dirección de un registro  (Leído 3115 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Cargar la dirección de un registro
« en: 28 de Septiembre de 2015, 11:36:12 »
Estoy intentando cargar la dirección de un registro en un puntero y el compilador da error.
¿Como se puede hacer?

Compilador: avr-gcc
Microcontrolador: Attiny88

Código: [Seleccionar]
  ldi   YL, lo8(r2)
Error del linker:
Citar
(.text+0xa0): undefined reference to `r2´

Quiero que YL (r28) valga $2
Podría hacerlo directamente (ldi YL, $2), pero me gustaría saber cómo hacerlo de forma genérica.

Un saludo.







Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: Cargar la dirección de un registro
« Respuesta #1 en: 28 de Septiembre de 2015, 11:40:44 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Cargar la dirección de un registro
« Respuesta #2 en: 28 de Septiembre de 2015, 13:19:10 »
No podes hacer eso Picuino por que esos registros no estan mapeados en la memoria, son pertenecientes al nucleo.

Aparte LDI es, si no me equivoco, justamente un inmediato, es decir un valor literal.
Si queres mover el valor de R2 a YL

mov YL,r2

El tema es que vas a tener que cargar el valor en r2 y volvemos al mismo tema que antes.

A que te referis de forma generica ? (Estoy intentando entender que queres hacer con eso y mas en ASM)

EDIT:
Si es por C:

http://svn.savannah.nongnu.org/viewvc/trunk/avr-libc/common/macros.inc?root=avr-libc&view=markup
A pesar que es de AVR-LIBC es usado aca:
https://gcc.gnu.org/wiki/avr-gcc

Pero no entiendo por que complicarse la vida cuando tranquilamente podrias utilizar un inline ASM, aunque usar un inline es una mala practica, y conviene usar un archivo aparte en ASM con la funcion en cuestion.
PD: R1 debe estar en 0.
« Última modificación: 28 de Septiembre de 2015, 13:50:26 por KILLERJC »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Cargar la dirección de un registro
« Respuesta #3 en: 28 de Septiembre de 2015, 18:55:22 »
Lo que quiero hacer es una rutina que mueva datos desde la SRAM hasta un grupo de registros (concretamente del r2 al r9)
Después tengo que volver a mover los datos de los registros a la SRAM.

Antes lo hacía a mano (8 instrucciones para un sentido y otras 8 instrucciones para copiar en el sentido contrario)
Ahora lo quiero hacer con punteros y bucles para que ocupe menos:

Código: [Seleccionar]

#define  data   r2

; Mueve los datos de la SRAM a los registros
pop_reg:
   ldi   YL, lo8(data_buff)
   ldi   ZL, lo8(data)
   rjmp memcpy

; Mueve los datos de los registros a la SRAM
push_reg:
   ldi   YL, lo8(data)
   ldi   ZL, lo8(data_buff)
   rjmp memcpy


; Mueve 8 datos desde la posición Y hasta la posición Z
memcpy:
   ldi    r_index, 8
memcpy_1:
   ld     temp0, Y+
   st     Z+, temp0
   dec    r_index
   brne   memcpy_1
   ret

P.D.: Ahora estoy escribiendo todo en ASM
« Última modificación: 28 de Septiembre de 2015, 18:58:57 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Cargar la dirección de un registro
« Respuesta #4 en: 28 de Septiembre de 2015, 19:38:06 »
a ver si esto te sirve
http://www.avr-asm-tutorial.net/avr_en/beginner/REGISTER.html


Gracias Stk, me da la impresión de que ese manual es para el ensamblador de Atmel, porque a mí no me ensambla:

Línea 203:
Código: [Seleccionar]
   ldi   ZL, LOW(data_buff)

Al ensamblar da este error:
xtea.asm:203: Error: garbage at end of line

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Cargar la dirección de un registro
« Respuesta #5 en: 28 de Septiembre de 2015, 19:43:36 »
Mmm estoy pensandolo, probaste con:

Código: ASM
  1. ; Setup inicial
  2.         ldi     YL,02  ; r2 0x0002
  3.         ldi     YH,00
  4.         ldi     ZL,lo8(databuffer)
  5.         ldi     ZH,hi8(databuffer)
  6.  
  7.         ; Cargar
  8.         LDI     R1,8
  9. Loop_cargar:
  10.         LD      R0,Z+
  11.         ST      Y+,R0
  12.         DEC     R1
  13.         BRNE    Loop_cargar
  14.  
  15.         ;Guardar
  16.         LDI     R1,8
  17. Loop_guardar:
  18.         LD      R0,-Y
  19.         ST      -Z,R0
  20.         DEC     R1
  21.         BRNE    Loop_guardar
  22.  
  23.         ;Preparo para el siguiente
  24.         ADIW ZL,8

No se hasta que punto es mejor directamente poner las 8 instrucciones, ademas no se si funcionaria.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Cargar la dirección de un registro
« Respuesta #6 en: 29 de Septiembre de 2015, 07:26:23 »
Lo he probado y ensambla sin problemas.
Lo que no sé es si funciona. Voy a probar.

De todas formas, me gustaría saber cómo hacerlo bien.

Un saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Cargar la dirección de un registro
« Respuesta #7 en: 29 de Septiembre de 2015, 08:01:58 »
con "LDI  YL, 2" funciona perfectamente.

El problema es que el código no es fácilmente modificable. Lo ideal es utilizar símbolos en vez de números concretos.

Lo que busco es la instrucción o macro de asembler que sea capaz de transformar r2 en el número 2 (su posición de memoria)

Un saludo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Cargar la dirección de un registro
« Respuesta #8 en: 29 de Septiembre de 2015, 13:17:42 »
Se me ocurren 1 sola opcion

Podrias Probar asignar un:

.equ r2 0x02

El tema pasa por si no esta tomado por el compilador ese simbolo. Probaste usar en ves de R2 , el valor asignado a R2 ?

.def ACANOMBREREGISTRO, r2

Aunque esto nuevamente termine no en lo que queres vos.
Un macro estamos en la misma, creo yo pero bueno, se podria probar, pero sigo con la idea que al final terminarias consumiendo la misma cantidad de instrucciones si lo que te preocupa es el tamaño.
Si lo que te preocupa es la vista del programa entonces ahi puede ser que si se resuma un poco


Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Cargar la dirección de un registro
« Respuesta #9 en: 29 de Septiembre de 2015, 16:02:27 »
Me he cansado.
He preguntado la misma cuestión en AVRFreaks y no parece que lo sepan tampoco.

Al final he puesto un 2 y listo.

Si algún día cambio el código por lo que sea, estoy seguro de que me pasaré varias horas intentando descubrir por qué no funciona.

Para evitarlo colocaré un define parecido al que has comentado:

#define DATA_REGISTER_INIT_ADDRESS   0x02   // Dirección del primer registro de datos (r2)

Así por lo menos tendré más posibilidades de encontrar el fallo.

Un saludo.