Autor Tema: Dos registros una direccion  (Leído 2190 veces)

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

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Dos registros una direccion
« en: 09 de Abril de 2012, 17:53:07 »
Hola se puede hacer que un registro tenga la misma dirección que otro, o sea
REG1 = REG2

y cuando hago: call  REG2, en realidad este direccionando REG1.
Es para hacer que varios REG esten apuntando a una solo para que el programa no se repita tantas veces como llamo a los REGs.
Saludos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dos registros una direccion
« Respuesta #1 en: 09 de Abril de 2012, 18:01:49 »
  No entiendo bien que es lo que quieres.  :oops:

  Si puedes explayarte un poco mas (tal vez con algún ejemplo) tal vez me sea más fácil comprender y tratar de ayudar.

De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: Dos registros una direccion
« Respuesta #2 en: 09 de Abril de 2012, 18:47:09 »
A lo primero si  se puede; tienes que usar las directivas udata_ovr, pero recuerda ponerles el mismo nombre a cada sección en cada bloque  de code.

A lo segundo; es imposible, las instruccion "call" solo hace referencia a una etiqueta del programa y no a un nombre de registro.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Dos registros una direccion
« Respuesta #3 en: 09 de Abril de 2012, 18:59:02 »
Lee un poco mas sobre direccionamiento indirecto del assembler...
Alli encontraras lo que creo que preguntas.
Un ejemplo claro es la rutina que propone Microchip para hacer un borrado de memoria Ram al inicio de un programa.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Dos registros una direccion
« Respuesta #4 en: 10 de Abril de 2012, 09:56:58 »
Gracias me dieron una pista.
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Dos registros una direccion
« Respuesta #5 en: 10 de Abril de 2012, 10:03:59 »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Dos registros una direccion
« Respuesta #6 en: 10 de Abril de 2012, 10:19:30 »
C o ASM? En asm no deberias tener problemas ya que se trabaja con etiquetas y/o direcciones de memoria.

En C los punteros son tus amigos!! Realmente no se que quieres hacer ya que el CALL se utiliza para ir a una direccion en concreto, nada que ver con registros.
El call se utiliza con una direccion de memoria por ejemplo CALL 0x00 (nos moveriamos a la direccion 0 de la memoria de programa). CALL 0x100 (nos moveriamos a la direccion 0x100).

Ahora si lo que quieres es tener 2 variables que apunten a la misma direccion de memoria o variable seria:

char variable;
char *var1, *var2;

var1=&variable;
var2=&variable;

si escribes en *var1 estarias escribiendo en la direccion de memoria variable, al igual que si escribes en *var2 tambien harias lo mismo.

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Dos registros una direccion
« Respuesta #7 en: 10 de Abril de 2012, 13:42:24 »
Hola me surge otra duda, yo uso muchas tablas para LCD y estoy mejorando una, para que sepan lo que estoy haciendo, si yo llamo a la lectura de una así:

Código: ASM
  1. movlw   UPPER   TABLA_ASCII
  2.         movwf   MsnAddressUpper_ASCII
  3.         movlw   HIGH    TABLA_ASCII
  4.         movwf   MsnAddressHigh_ASCII
  5.         movlw   LOW     TABLA_ASCII
  6.         movwf   MsnAddressLow_ASCII
  7.  
  8.         movff   MsnAddressUpper_ASCII,TBLPTRU
  9.         movff   MsnAddressHigh_ASCII,TBLPTRH
  10.         movff   MsnAddressLow_ASCII,TBLPTRL
  11.  
  12. BUSCO2
  13.     tblrd *+                                           ; Incrementa puntero de tabla antes de su lectura
  14.     NOP                                ; Nada solo por las dudas.
  15.     movff     TABLAT,TEMP_CARACTER       ; Cargo el caracter para luego enviarlo con TX_SPI_D.
  16.     DCFSNZ  CounterA,F                 ; Decremento el contador para obtener el caracter entero.
  17.     RETLW   0X00                       ; Se termino la cuenta y mi cod. también
  18.     CALL     TX_SPI_D                  ; Lo envio al LCD
  19.     TBLRD *+                           ; Leo la tabla nuevamente para saltearme un dato, ya que va de dos en dos.
  20.     movff    TABLAT,TEMP_CARACTER       ; Cargo el dato, esto no es necesario.
  21.     CLRF    TEMP_CARACTER              ; y lo borro
  22.     GOTO    BUSCO2                     ; Vuelvo a buscar

Cuando llamo al primer tblrd *+ como puedo guardar esa posicion de memoria de la tabla para luego volover a llamar la tabla desde ahi sin  cargar la primer parte del cod.
Código: ASM
  1. movwf   MsnAddressUpper_ASCII
  2.         movlw   HIGH    TABLA_ASCII
  3.         movwf   MsnAddressHigh_ASCII
  4.         movlw   LOW     TABLA_ASCII
  5.         movwf   MsnAddressLow_ASCII
  6.  
  7.         movff   MsnAddressUpper_ASCII,TBLPTRU
  8.         movff   MsnAddressHigh_ASCII,TBLPTRH
  9.         movff   MsnAddressLow_ASCII,TBLPTRL

Es para poder usar varias tablas a a vez.
Yo estoy intentando asi:

Código: ASM
  1. BUSCO3
  2.         movff   TBLPTRU,TBLPTRU_TEMP
  3.         movff   TBLPTRH,TBLPTRH_TEMP
  4.         movff   TBLPTRL,TBLPTRL_TEMP
  5.         tblrd *+                                               ; Incrementa puntero de tabla antes de su lectura
  6.  
  7.     movff       TABLAT,ASCIICode           ; Cargo el caracter para luego enviarlo con TX_SPI_D.

Pero no me sale, saben como hacerlo?
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Dos registros una direccion
« Respuesta #8 en: 10 de Abril de 2012, 16:02:25 »
Hola ya encontre la manera, me trabe en una instruccion que estaba mal, les muestro el cod.:
Código: ASM
  1. BUSCO_CARACTER
  2.         movff   AddrTablaUpper,TBLPTRU
  3.         movff   AddrTablaHigh,TBLPTRH
  4.         movff   AddrTablaLow,TBLPTRL
  5.  
  6. LOOP_CARACTER
  7.     tblrd *+                                           ; Incrementa puntero de tabla antes de su lectura
  8.     movff       TBLPTRU,TBLPTRU_TEMP
  9.     movff       TBLPTRH,TBLPTRH_TEMP
  10.     movff       TBLPTRL,TBLPTRL_TEMP
  11.     movff       TABLAT,ASCIICode           ; Cargo el caracter para luego enviarlo con TX_SPI_D.
  12.     MOVLW   0XFd    
  13.     XORWF   ASCIICode,W      
  14.     BTFSC   STATUS,Z                   ;SI LOS DATOS SON IGUALES,
  15.     goto    Termina2                   ; Si llego al fin salto
  16.     call    GetASCIIByte                   ; Lo envio a la segunda tabla para
  17.                                        ; codificar y luego al LCD
  18.  
  19. RESTAURO_TABLAS        
  20.         movff   TBLPTRU_TEMP,TBLPTRU
  21.         movff   TBLPTRH_TEMP,TBLPTRH
  22.         movff   TBLPTRL_TEMP,TBLPTRL
  23.         TBLRD *+                           ; Leo la tabla nuevamente para saltearme un dato, ya que va de dos en dos.
  24.     GOTO    LOOP_CARACTER
  25.  
  26. Termina2
  27.     RETLW    0X00

Les paso la dirección de donde esta todo el proyecto, o parte de el.
http://www.todopic.com.ar/foros/index.php?topic=37913.0

Gracias y saludos