Autor Tema: Dudas con instruciones  (Leído 1691 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Dudas con instruciones
« en: 15 de Octubre de 2015, 04:52:50 »
Hola, hay una cosa que llevo tiempo intentando encontrar la explicación y no encuentro nada por internet con referencia al uso de algunas de las instrucciones en ASM de los Pic's.
Por ejemplo la instrucción RRF la usamos para dividir por 2, RLF para multiplicar por 2, ANDLW hacemos un AND entre el literal y W pero no entiendo el porque de hacer un AND entre dos números ¿Hay algún libro o algún sitio donde se explique el uso que se le da a alguna de estas instrucciones?
Pregunto eso porque para mi es la base de entender el funcionamiento de los programas ya que muchas veces intento entender como funciona y siempre me quedo a medias.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dudas con instruciones
« Respuesta #1 en: 15 de Octubre de 2015, 05:31:51 »
No entiendo tampoco a que queres llegar xD. No se si a lo que apuntas es el por que rotar es dividir/multiplicar por 2, o por que se usa una AND. Voy a escribir esto y si seguis teniendo dudas espero llegar a entenderlas o que otro llegue a entender el "por que" que estas buscando.

Uno normalmente intenta llegar de un "numero" a otro, o por ahi mejor dicho de un formato a otro. Para eso sacamos provecho de la logica de las AND / OR / XOR / rotaciones, etc.
el AND no tiene comparacion matematica con nada ( No es como dividir por 2 cuando rotamos, incluso rotar puede no significar eso ) sino que  lo unico que hace es respetar una tabla de verdad:

ABS
000
010
100
111

Y nosotros intentamos sacar provecho de esa tabla de verdad, vemos que lo unico que le ponga un 1 va a sobrevivir, todo lo demas se va a poner en 0. Te propongo 2 casos,

-1, obtener el valor del puerto B, los bits 1 al 5 y, que esos bits comienzen en el bit 0. Entonces voy a hacer:

PORTB 0101 0110 , Hago una AND aprovechando la tabla de verdad, esto me va a permitir quitar los bits que yo no quiero
AND      0011 1110
Igual:     0001 0110
Roto Derecha y 0000 1011 quedo mi resultado.... pero rotar a la derecha fui dividir por 2 para mi ? No, simplemente esa colecccion de bits para mi era eso, solo una coleccion de bits no era un numero.

O tal ves supongamos que es un numero y quiero llegar al multiplo de 4 anterior a ese valor, el mas cercano. 1100 1101, tengo que llegar a 1100 1100, o mejor:
de aaaa aabb deberia llegar a: aaaa aa00 , Cuales la forma mas rapida de hacer esto? Aprovecho una OR? No puedo, Podria restar "bb", pero ahora tengo otro problema y es solamente la extraccion de "bb" Lo mas simple es aplicar una AND.

-2
Ahora si supongamos tengo 120 expresado en binario: 0111 1000. Y necesito obtener el binario que sea equivalente a ese numero dividido por 2. Yo se que 60 es expresado en binario: 0011 1100 ,
Tengo que buscar una forma de llegar de un numero al otro, sumo, resto, AND, OR? no lo mas simple es rotarlo, en este caso rotarlo tuvo el mismo resultado que dividirlo por 2, pero sigue siendo una rotacion como arriba ( de una coleccion de bits ).
La explicacion de por que rotar es una division por 2 esta basada en como es la base del numero. 1*2⁶ + 1*2⁵ + 1*2⁴ + 1*2³ + 0*2² + 0*2¹ + 0*2⁰ , (dividis por 2 y es restarle un -1 a cada exponente )
Pero la idea partio de un coleccion de bits y llegar a otra.

Otra puede ser una XOR, para que usarias una XOR ?

ABS
000
011
101
110

Veamos, si yo tengo el valor A, y el B es el dato que yo le agrego, puedo ver que cuando pongo un 1 invierto el bit!. Obviamente lo puedo usar para ese caso!,

PORTB 0110 1101 , debo llegar a 1110 0100
Invertir el bit 1,3,7 los demas dejarlo asi,
Cargo en W 1000 1001 y hago una XOR, Nuevamente la idea es de llegar de una coleccion de bits a otro.

Tambien podria ser util en otra aplicacion, veo que si tengo 2 o 0 unos se hace 0, y si tengo 1 solo uno es 1 ... Esto puede ser bueno para la paridad, si es par 0, si es impar 1. Tal ves en otra tambien
Por que no use una AND y una OR? por que son menos pasos :P

Creo que una ves salio el tema con vos.
¿Que diferencia hay entre estos valores?

-a 1100 1101
-b 1100 1101
-c 1100 1101
-d 1100 1101
-e 1100 1101

¿ Ninguna ? ....
a para mi son es un numero sin signo ( 205 )
b para mi es un numero con signo ( -141 )
c para mi son 2 numeros, los 4 bits de arriba me indican un numero y los 4 bits de abajo otro ( 12 y 13 )
d para mi no es un numero, son los estados de un puerto
e para mi tampoco es un numero son flags que utilizo y que me indican .......

En fin.. eso puede representar cualquier cosa, es una coleccion de 1s y 0s, Si yo uso la rotacion como RRF en cualquiera, solamente en el caso de "a" va a ser equivalente a dividirlo por 2, todo lo demas es una simple rotacion de bits (que realmente es).

Creo que todo pasa por:  Tratar de llegar de una coleccion de bits a otro. ( y que se cumpla para cualquier coleccion de bits que se presente )

Estas preguntas filosoficas de Miguel :P
« Última modificación: 15 de Octubre de 2015, 05:40:53 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con instruciones
« Respuesta #2 en: 15 de Octubre de 2015, 15:53:52 »
Gracias KILLERJC.
Estas preguntas filosoficas de Miguel :P
:D
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Dudas con instruciones
« Respuesta #3 en: 15 de Octubre de 2015, 17:27:18 »
El AND lo puedes uilizar en asm, para enmascarar un conjunto de bits, ese es otro uso que se le da a el comando andlw.
En el siguiente enlace podras obtener un ejemplo de ello.

https://es.wikipedia.org/wiki/Operador_a_nivel_de_bits

Saludos

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con instruciones
« Respuesta #4 en: 15 de Octubre de 2015, 19:36:55 »
Gracias RALF2.

Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.