Autor Tema: Funcion ROTATE_LEFT  (Leído 7111 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado _CMaGNo_

  • PIC10
  • *
  • Mensajes: 27
Funcion ROTATE_LEFT
« en: 18 de Abril de 2006, 21:34:20 »
Hola!. Bueno, aqui va otra pequeña duda ... la funcion ROTATE_LEFT del PCW C es equivalente a la instruccion RLF en ensamblador? ... es decir, con ROTATE_LEFT se hace una rotacion hacia la izquierda teniendo en cuenta el bit del Carry como lo hace RLF o simplemente el MSB pasa a ser el LSB sin tener en cuenta el Carry???

Gracias!  :)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Funcion ROTATE_LEFT
« Respuesta #1 en: 18 de Abril de 2006, 22:06:16 »
Hola!. Bueno, aqui va otra pequeña duda ... la funcion ROTATE_LEFT del PCW C es equivalente a la instruccion RLF en ensamblador? ... es decir, con ROTATE_LEFT se hace una rotacion hacia la izquierda teniendo en cuenta el bit del Carry como lo hace RLF o simplemente el MSB pasa a ser el LSB sin tener en cuenta el Carry???

Gracias!  :)

Muchas veces me surgen dudas bastante específicas como esta que comentas.  No siempre estan documentadas en el datasheet o en algun manual.  Desconozco si es el caso de esta función pero te cuento que hago en estos casos.

En general, lo que suelo hacer es hacer un pequeño programa que contemple la instruccion que quiero probar y lo compilo.

Luego sigo 2 caminos.

1) Observar el código ensamblador que generó y ahi veo bien que hace
2) Observar en el simulador como van variando los registros cuando le aplico la función.

Espero te sea de utilidad, no solo para este caso sino para otras dudas similares que te puedan surgir.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Funcion ROTATE_LEFT
« Respuesta #2 en: 19 de Abril de 2006, 02:17:14 »
Amigo _CMagMo_

Aqui te pego un ejemplo de lo que genera CCS C al encontrarse una rotación a la derecha de 1 bit, extraído del programa que hice para el manejo del teclado PS/2, como puedes ver la traducción a Ensamblador es casi directa:

....................       data = (data >> 1);
01D5:  BCF    03.0
01D6:  RRF    34,F

Nota: 34 es la dirección de RAM de la variable data.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Funcion ROTATE_LEFT
« Respuesta #3 en: 19 de Abril de 2006, 12:21:58 »
Efectivamente:

¡ Simplemente el MSB pasa a ser el LSB sin tener en cuenta el Carry !

Desconectado _CMaGNo_

  • PIC10
  • *
  • Mensajes: 27
Re: Funcion ROTATE_LEFT
« Respuesta #4 en: 19 de Abril de 2006, 13:14:38 »
Hola ... gracias por las respuestas, pero he quedado algo confundido ... redpic, tu dices que al usar rotate_right CCS C lo traduce a RRF (que utiliza el carry) y supongo que al usar rotate_left lo traduce por RLF ... y porcher, tu dices que pasa el MSB al LSB (en el caso de rotate_left) que es algo parecedido a lo que lei en un manual de CCS C ... Voy a probarlo y les cuento. Ahh y maunix, tu metodologia me parece apropiada, voy a hacerlo como dices.

Gracias de nuevo!

Desconectado _CMaGNo_

  • PIC10
  • *
  • Mensajes: 27
Re: Funcion ROTATE_LEFT
« Respuesta #5 en: 19 de Abril de 2006, 13:46:07 »
Acabo de probarlo con un ejemplo donde utilizo dos variables x1 y x2 e intento rotarlas hacia la izquierda usando rotate_left y rlf.

Código: [Seleccionar]
       if (input(pin_a0)) {
         rotate_left(&x1,1);
      }
      else if (input(pin_a1)) {
         #asm
            rlf x2
         #endasm
      }

La traduccion que hace CCS C para la instruccion rotate_left(x1,1) es

0004:  RLF    20,W
0005:  RLF    20,F

Donde 20 es la direccion de la variable x1

Lo probe con unos led y el resultado fue diferente con una y con otra instruccion. En conclusion, la funcion rotate_left NO tiene en cuenta el Carry mientras que RLF si lo hace ... la pregunta es, existe alguna funcion en CCS que haga exactamente lo mismo que RLF o cada vez que se necesite rotacion con carry hay que utilizar codigo embebido en ensamblador?.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Funcion ROTATE_LEFT
« Respuesta #6 en: 19 de Abril de 2006, 15:05:05 »
Acabo de probarlo con un ejemplo donde utilizo dos variables x1 y x2 e intento rotarlas hacia la izquierda usando rotate_left y rlf.

Código: [Seleccionar]
       if (input(pin_a0)) {
         rotate_left(&x1,1);
      }
      else if (input(pin_a1)) {
         #asm
            rlf x2
         #endasm
      }

La traduccion que hace CCS C para la instruccion rotate_left(x1,1) es

0004:  RLF    20,W
0005:  RLF    20,F

Donde 20 es la direccion de la variable x1

Lo probe con unos led y el resultado fue diferente con una y con otra instruccion. En conclusion, la funcion rotate_left NO tiene en cuenta el Carry mientras que RLF si lo hace ... la pregunta es, existe alguna funcion en CCS que haga exactamente lo mismo que RLF o cada vez que se necesite rotacion con carry hay que utilizar codigo embebido en ensamblador?.


No entiendo bien tu punto.  Esas 2 lineas es el código generado por todas las instrucciones de más arriba?

Es que no veo que sean lo mismo, por eso mi pregunta.

A mi modo de ver RLF 20,w rotando una vez el valor y lo guarda en W (es decir que tu registro no se actualizaria).
RLF 20,F estaría actualizando el registro y tal vez esto sea lo que busques.

Fijate si dicha función no necesita algo asi como una asignacion del lado izquierdo que vuelva a guardar el resultado en X1.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado _CMaGNo_

  • PIC10
  • *
  • Mensajes: 27
Re: Funcion ROTATE_LEFT
« Respuesta #7 en: 19 de Abril de 2006, 22:18:03 »
Citar
0004:  RLF    20,W
0005:  RLF    20,F

Esas dos lineas equivalen solo a al instruccion rotate_left(&x1,1). Igual como te dije, lo probe con unos led en proteus y cuando utilizo RLF tiene en cuenta el valor del carry y con rotate_left no, solo pasa el MSB al LSB ... el codigo en ensamblador generado por el CCS C parece no ser muy claro, pero eso hace .. curioso ¿no?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Funcion ROTATE_LEFT
« Respuesta #8 en: 19 de Abril de 2006, 22:34:28 »
Hola.
Si esas dos lineas de asm que acabas de postear corresponden al codigo que genera la instruccion rotate_left, pues destaco dos cosas:

1) Mirando esas dos lineas de manera aislada, la linea 0004 (RLF 20,W) carece de sentido, pero como no veo el programa entero, no puedo asegurar que lo que digo sea 100% cierto;

2)La linea 0005(RLF 20,F) sí hace lo que tu quieres. Por lo tanto, si observas que el comportamiento en la practica difiere entre ambos casos, aun cuando el asm generado parece ser identico, debo asegurar que el distinto comportamiento se debe a el estado del Carry antes de ejecutarse la/s linea/s, y no a diferencias en la herramienta de programacion utilizada.
Exitos!
« Última modificación: 19 de Abril de 2006, 22:36:10 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado _CMaGNo_

  • PIC10
  • *
  • Mensajes: 27
Re: Funcion ROTATE_LEFT
« Respuesta #9 en: 19 de Abril de 2006, 22:58:44 »
Pues en la practica deberia funcionar, porque como tu dices, la traduccion de la instruccion rotate_left es rlf, el cual deberia tener en cuenta el carry, pero al probarlo no es asi, simplemente se pasa el MSB al LSB. Es diferente el comportamniento cuando se usa rotate_left y cuando se usa la instruccion de ensamblador embebida ... simplemente rotate_left no tiene en cuenta el carry ... lo que no me explico es por que es asi.

Si quieres puedes probarlo en proteus ... insisto ... curioso ¿no?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Funcion ROTATE_LEFT
« Respuesta #10 en: 19 de Abril de 2006, 23:35:52 »
Hola.
No soy de insistír tanto, pero si en asm el código es RLF 20,F, pues ese código se deslíga por completo de cualquier lenguaje de programación que hayas utilizado. A partir de allí, el ensamblador es el que se encarga de traducirlos a hexadecimal, y es lo mísmo si le pusiste tú el RLF, o lo generó otra herramienta.
Debo insistír en que hay una equivocación, o bien una diferencia entre ambos códigos.
Sí que quiero verlo al código, espero el programa.
Exitos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Funcion ROTATE_LEFT
« Respuesta #11 en: 21 de Abril de 2006, 09:20:06 »
La explicación es sencilla:

RLF    20,W

Al ejecutar esta instrucción pasa el MSB al Carry sin alterar el valor de la variable ya que el resultado del desplazamiento lo guarda en W

RLF    20,F

Al ejecutar esta instrucción pasa el bit almacenado en el Carry (el MSB) a la posición LSB de la variable, ya que esta vez el resultado del desplazamiento lo guardas en la variable.

En cuanto al código que dice RedPic del CCS sí se comporta como el ensamblador ya que:

BCF    03.0

Pone el Carry a 0, la posición 03 corresponde al registro STATUS y el bit 0 al Carry

RRF    34,F

Realiza el desplazamiento a la derecha con lo que el valor del Carry (0) pasa a ser el LSM de la posición 34.

Lo que quiere decir que todos tenéis razón, ya que cada compilador lo traduce de forma diferente uno como un desplazamiento sin carry y otro con carry.

Por esto me gusta el ensamblador, sabes lo que ocurre en todo momento.
« Última modificación: 21 de Abril de 2006, 09:46:02 por Manofwar »
Saludos desde Almería, España

Desconectado jsalomon

  • PIC10
  • *
  • Mensajes: 1
Re: Funcion ROTATE_LEFT
« Respuesta #12 en: 02 de Marzo de 2010, 02:08:04 »
Hay que poner el signo & para que considere el carry.

rotate_left(&VARIABLE,1);

saludos, George.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Funcion ROTATE_LEFT
« Respuesta #13 en: 03 de Marzo de 2010, 06:15:45 »
Nor, la instrucción rotate_left(&variable,1) no tiene en cuenta al Carry, simplemente el MSB pasa a la posicion del LSB sin tener en cuenta el Carry.