Autor Tema: STATUS,C y STATUS,Z  (Leído 32709 veces)

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

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
STATUS,C y STATUS,Z
« en: 07 de Octubre de 2008, 12:38:21 »
Hola a todos.
Alguien me podría explicar por encima como funcionan...
Quiero aprender a comparar variables en Asm, por lo que yo entiendo cuando el resultado de una operación aritmética es 0 o distinta de 0 se ve en STATUS,Z , osea si hago 2-3, en STATUS,Z tendré un 1 y si hago 3-2 tendré un 0 ... no?

El STATUS,C no lo entiendo para nada.... y veo que se usa en rutinas de comparación.
Si alguien puede arrojar un poquito de luz se lo agradecería mucho...

Saludos.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: STATUS,C y STATUS,Z
« Respuesta #1 en: 07 de Octubre de 2008, 15:33:28 »
Qué tal arcachofo.

El Bit Z del registro STATUS se coloco en 1 únicamente cuando la operación da cero. En los ejemplos que tú colocaste, en ninguno de los dos casos es así. Z sería uno si haces, por ejemplo 2-2 o 3-3.
El bit Z se usa mucho para saber si un número es igual a otro.

El Bit C de STATUS se coloca en 1 únicamente si en la operación hubo un acarreo, y en 0 si hay un préstamo. Por ejemplo, si la suma pasa de 255, entonces se coloca en 1 (debes aclararlo antes). Si quieres saber si una resta da negativo, entonces colocas el bit C en 1, y al hacer la resta, si da negativa C=0 (hubo préstamo), si da positiva C=1 (no hubo préstamo).
Se usa bastante para saber si una variable es "mayor que" o "menor que" otra variable o un valor constante.

Espero haberte ayudado con tus dudas.
Saludos, nos leemos!  :mrgreen:

EDITO: porque había colocado "acarreo" en el caso de la resta, cuando lo correcto es préstamo (acarreo es para suma).
« Última modificación: 07 de Octubre de 2008, 18:12:49 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: STATUS,C y STATUS,Z
« Respuesta #2 en: 07 de Octubre de 2008, 15:38:46 »
Muy buena explicación de FIREPIC, ante todo te recomiendo siempre que leas el datasheet del micro en cuestión que allí tienes el 99,9% de las respuestas, por ejemplo para los micros 16f8x en la página 15 del datsheet:

explicación del registro status:
bit 2: Z : Zero bit
1 = The result of an arithmetic or logic operation is zero
0 = The result of an arithmetic or logic operation is not zero

bit 0: C : Carry/borrow bit (for ADDWF and ADDLW instructions)
1 = A carry-out from the most significant bit of the result occurred
0 = No carry-out from the most significant bit of the result occurred
Note:
For borrow the polarity is reversed. A subtraction is executed by adding the two’s complement of
the second operand. For rotate (RRF ,RLF) instructions, this bit is loaded with either the high or low
order bit of the source register.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: STATUS,C y STATUS,Z
« Respuesta #3 en: 07 de Octubre de 2008, 16:47:14 »
Muchas gracias a los dos por sus respuestas, ya sé como comparar variables,.. bit C para mayor o menor y bit Z para igual.

flacoclau: sí... me miré el datashhet y manuales de asm, pero no encontré nada claro, hice ejemplos en basic y los pasé a ASM para ver como lo hacían, pero aún así no terminaba de entender;

En el datashhet del pic que uso (16F628A) viene exactamente lo mismo que pusiste... pero no tengo ni idea de lo que es acarreo ni borrow, y sigo sin tenerla... mis conocimientos de binario no llegan a tanto; lo del bit Z en el datasheet está claro, pero supuse que si la operación es menor que 0 lo considera como 0... , pero como lo ha explicado firepic está muy claro y además es bien sencillo... al menos una vez que sabes como es...  :)

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: STATUS,C y STATUS,Z
« Respuesta #4 en: 07 de Octubre de 2008, 18:20:36 »
Pues arcachofo te recomiendo que comiences a estudiar más de los números binarios y hexadecimales, es bien importante.

No es nada del otro mundo... acarreo es como por ejemplo sumar 99+1... cuánto da? 100, porque al decir "9+1" para sumar las unidades da 10, qué haces? colocas 0 y "llevas" 1. Eso de "llevas" es justamente un acarreo.

Y borrow, o préstamo, es cuando restas... por ejemplo, si restas 22-7... al restar las unidades, dices 2-7, pero eso no puede ser, así que le "pides prestado" a las decenas, y dices 12-7... al final el resultado es 15... aquí en esta operación hubo un "borrow" o préstamo.

Espero haberte ayudado un poquito más. Pero estudia los sistemas de numeración base 2 (binario) y 16 (hexadecimal), te ayudará muchísimo a la hora de programar micros.

Saludos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: STATUS,C y STATUS,Z
« Respuesta #5 en: 07 de Octubre de 2008, 19:58:44 »
Hola a todos!

Vengo a expandir y corregir unas cositas:

Qué tal arcachofo.

El Bit Z del registro STATUS se coloco en 1 únicamente cuando la operación da cero. En los ejemplos que tú colocaste, en ninguno de los dos casos es así. Z sería uno si haces, por ejemplo 2-2 o 3-3.
El bit Z se usa mucho para saber si un número es igual a otro.

Y se usa mucho también para saber si un registro vale 0...(instrucción movf registro,f). Se mueve el registro sobre si mísmo(lo que no parecería tener mucho sentido) pero se setea el bit Z si el valor del registro vale 0. Para eso se utiliza la movf reg,f

El Bit C de STATUS se coloca en 1 únicamente si en la operación hubo un acarreo, y en 0 si hay un préstamo. Por ejemplo, si la suma pasa de 255, entonces se coloca en 1 (debes aclararlo antes). Si quieres saber si una resta da negativo, entonces colocas el bit C en 1, y al hacer la resta, si da negativa C=0 (hubo préstamo), si da positiva C=1 (no hubo préstamo).

Que el flag C valga 1 no implica que haya existido acarreo necesariamente. Tampoco que valga 0 implica que haya habido préstamo.El flag C se comporta de manera distinta dependiendo de si estamos realizando una suma o una resta(dejemos otro tipo de operaciones como las rotaciones de lado por ahora).
Tampoco es necesario setear(poner a 1) o limpiar(poner a 0) el bit C antes de ejecutar una suma o resta. El bit C es modificado por el uC según el resultado de la operación.

antes de una suma:  STATUS,C = X (X= no interesa)

después de la suma: STATUS,C= 0 implica que el resultado de la suma no produjo desbordamiento(es decir,no superó el valor 255)
                               STATUS,C=1 implica que el resultado de la suma pordujo desbordamiento(es decir, superó el valor 255)



antes de una resta:  STATUS,C = X (X= no interesa)

después de la resta: STATUS,C= 0 implica que el resultado de la resta es "negativo". Es decir, el sustraendo es mayor al minuendo (Registro<W(subwf) ó Literal<W(sublw))
                              STATUS,C=1 implica que el resultado de la resta es positivo o cero. Es decir que el sustraendo es menor o igual al minuendo(Registro>=W(subwf) ó Literal>=W(sublw))


Aplicable a las familias 16X e inferiores. Las superiores permiten hacer W-F, W-L y otras...

Saludos
"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 arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: STATUS,C y STATUS,Z
« Respuesta #6 en: 07 de Octubre de 2008, 22:46:22 »
Vaya!... muchas gracias por las explicaciones, tanto a firepic que explica las cosas como yo las entiendo como a Brunof que profundiza en el tema... estoy aprendiendo mucho...

Y.. sí.. tengo que meterme más a fondo en el binario y hexadecimal, al final todo es mucho más sencillo.

Hace un par de días entendí el porqué del uso de hexadecimal y lo sencillo que es en realidad y fué gracias a un tema que estaba explicando Brunof en una discusión, entonces ví claro que cuando escribes un valor en hexa. en un registro de 8 bits, el primer dígito vá en los 4 primeros bits y el segundo en los otros 4, parece una tontería pero a mí se me aclararon muchas cosas... 16 posibles valores... 4 dígitos en binario y 1 en hexadecimal... sí que lo había leido muchas veces por ahí pero hasta ahora no lo entendí realmente... :)... cada dígito en hexa es un nible de esos...

Brunof... ahora me dejaste preocupado con lo del desbordamiento de pila y todo eso... osea que no puedo sumar dos números con resultado mayor que 255?  :? .... lógicamente no... o al menos no con un solo registro de 8 bits... vaya.. yo que empezaba a estar tranquilo y resulta que los problemas no acaban más que empezar...  :(
Y por cierto ... que pasa con los resultados menores que 0?... tambien se me vá a desbordar algo??... dios mio!!... con lo facil que era todo en basic!!...

Jejeje... si no me lo tomo con un poco de humor no se haría...  :mrgreen:

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: STATUS,C y STATUS,Z
« Respuesta #7 en: 08 de Octubre de 2008, 13:29:50 »
Qué tal a todos!
Gracias por las correcciones Bruno, como siempre todo un experto!
Tampoco es necesario setear(poner a 1) o limpiar(poner a 0) el bit C antes de ejecutar una suma o resta. El bit C es modificado por el uC según el resultado de la operación.

antes de una suma:  STATUS,C = X (X= no interesa)

después de la suma: STATUS,C= 0 implica que el resultado de la suma no produjo desbordamiento(es decir,no superó el valor 255)
                               STATUS,C=1 implica que el resultado de la suma pordujo desbordamiento(es decir, superó el valor 255)

antes de una resta:  STATUS,C = X (X= no interesa)

después de la resta: STATUS,C= 0 implica que el resultado de la resta es "negativo". Es decir, el sustraendo es mayor al minuendo
Eso no lo sabía... gracias por la clase!

Brunof... ahora me dejaste preocupado con lo del desbordamiento de pila y todo eso... osea que no puedo sumar dos números con resultado mayor que 255?  :? .... lógicamente no... o al menos no con un solo registro de 8 bits... vaya.. yo que empezaba a estar tranquilo y resulta que los problemas no acaban más que empezar...  :(
Arcachofo, en ninguna parte se habló del desbordamiento de pila, eso es harina de otro costal...

Bruno simplemente mencionó "desbordamiento"... es decir, si el número es mayor a 255 o FF, supongamos que sea 256, que en hexadecimal es 100... allí hay un desbordamiento... porque se pasa de la "capacidad" del byte, que es de 0-255. En ese caso el registro quedaría en 00, y ocurre un acarreo desde el bit más significativo, y C se coloca en 1. Es decir, que con toda tranquilidad puedes hacer operaciones cuyo resultado sea mayor que 255, y puedes usar C para concatenar el resultado en varios bytes... pero mejor creo que no nos metemos con eso de "concatenar" todavía.

Y claro que puedes restar dos números, no importa que el resultado sea menor que cero... pasa igual que en el caso anterior... habrá un préstamo y C será aclarado.

Lo importante aquí es que si, digamos tienes dos registros, supongamos A y B...y haces una suma o resta y la guardas en W.

Si haces W=A+B y C=0... Ok, no hubo desbordamiento... entonces el valor de W es el resultado matemático real de la suma.
Si haces W=A+B y C=1... entonces hubo desbordamiento... el valor de W no es el resultado real, debes tomar en cuenta el acarreo.
Si haces W=A-B y C=1... Ok, no hubo préstamo... el valor de W es el resultado matemático real de la resta (y A>=B).
Si haces W=A-B y C=0... entonces hubo préstamos... el valor de W no es el resultado de la resta (y A<B).

Espero haberte ayudado a aclarar un poco más las cosas...
Bruno si me eché un pelón no dudes en corregirme eh!  :lol:

Saludos, nos leemos!  :mrgreen:

EDITO: por el detalle que corrigió flacoclau más abajo. Gracias viejo!
« Última modificación: 09 de Octubre de 2008, 18:11:20 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: STATUS,C y STATUS,Z
« Respuesta #8 en: 08 de Octubre de 2008, 15:21:44 »



antes de una resta:  STATUS,C = X (X= no interesa)

después de la resta: STATUS,C= 0 implica que el resultado de la resta es "negativo". Es decir, el sustraendo es mayor al minuendo (Registro<W(subwf) ó Literal<W(sublw))
                              STATUS,C=1 implica que el resultado de la resta es positivo o cero. Es decir que el sustraendo es menor o igual al minuendo(Registro>=W(subwf) ó Literal>=W(sublw))


Aplicable a las familias 16X e inferiores. Las superiores permiten hacer W-F, W-L y otras...

Saludos

Es tan asi con la resta?
por que tenía entendido que e borrow dependía del estado anterior de carry, por eso pregunto, saludos!!
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: STATUS,C y STATUS,Z
« Respuesta #9 en: 08 de Octubre de 2008, 15:29:20 »
Así es. Es indiferente del estado anterior del bit de acarreo. Yo entiendo lo que ustedes intentan decir, pero el uC lo pone a 0 o a 1 según corresponda luego de una operación de estas. No hace falta pre-cargarlo(y he visto montones de personas que lo hacen).
Sino, siempre podés simularlo. Recién lo hice en el MPLAB y sostiene lo que digo :)


   include "p16F84A.inc"

   org 0x00

   bcf      STATUS,Z
   bcf      STATUS,C
   bcf      STATUS,DC
   movlw   0xF0                    ;aquí Z= 0, C= 0, DC= 0
   sublw   0xF0
   nop                                      ;aquí Z= 1, C= 1, DC= 1

Saludos.



   END
« Última modificación: 08 de Octubre de 2008, 15:33:31 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 BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: STATUS,C y STATUS,Z
« Respuesta #10 en: 08 de Octubre de 2008, 15:31:50 »
Si haces W=A-B y C=1... Ok, no hubo préstamo... el valor de W es el resultado matemático real de la resta (y A>B).
Bruno si me eché un pelón no dudes en corregirme eh!  :lol:

Jaja! Pos re bien! Sólo un detalle:
Si haces W=A-B y C=1... Ok, no hubo préstamo... el valor de W es el resultado matemático real de la resta (y A>=B).
"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 arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: STATUS,C y STATUS,Z
« Respuesta #11 en: 08 de Octubre de 2008, 15:47:41 »
Oye... mil gracias de nuevo por las explicaciones, es más de lo que había pedido, pero me está sirviendo de mucho y además mucho más ameno que cualquier manual...:)

Desbordamiento para un ignorante como yo suena a catástrofe... inundación o cosas así.... jeje.. solo estaba bromeando un poco a costa de mi desconocimiento.

Bueno pues ya voy entendiendo un poco más... yo que pensaba que ya me lo sabía todo de C y Z...
Claro, ahora que lo pienso, el C está ahí precisamente para eso.. para que el rio no se desborde y no haya una catástrofe...

Para la suma en cierto modo se comporta como un bit más.. no?... osea con 8 bits 256 posibles valores, con un bit más cubrimos los 512 posibles valores de una suma de dos números de 8 bits

En caso de la resta... el resultado debería ser el complementario o algo así en caso de que STATUS,C sea cero, osea resultado real = -(11111111 - RESULTADO)... no?

Bueno... no sé si será exactamente así, pero lo que si veo es lo complejo que es para el procesador hacer una simple resta, no me quiero ni imaginar como se las arregla para hacer una simple división.

LLegados a este punto veo que el Asm es práctico para ciertas cosas, o para ciertas rutinas sobre las que hay que llevar el control exacto, pero para hacer un programa minimamente complejo habría que tener librerías de subrutinas o macros o algo por el estilo de funciones matemáticas, delays y cosas así, y de ahí a un lenguaje de alto nivel solo hay un paso....
Quizá esto sea tema para otra discusión.... pero como os las arreglais vosotros?...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: STATUS,C y STATUS,Z
« Respuesta #12 en: 08 de Octubre de 2008, 16:05:41 »
Hola arcachofo. Si, para la suma se comporta como el noveno bit(el más significativo) del resultado.

El método que utiliza el PIC para la resta es complemento a 2, por lo que para obtener el número en caso de que sea negativo, tenés que hacer: -(!RESULTADO+1)
Donde "!" indica la operación de negado, o complemento.

Ejemplo:

   movlw .1
   movwf Reg
   movlw .2
   subwf   Reg,F  ;Reg=Reg-W=1-2=-1
   
El uC lo guarda como 0xFF(STATUS,C=0).

Para recuperar el valor, harías entonces:
!Reg= 0x00
+1
= 0x01

Como sabíamos que STATUS,C valió cero, entonces podemos saber que estamos ante un negativo, y este es: -1

En asm podrías hacer:
comf  Reg,F        ;complemento de Reg
incf    Reg,F        ;Reg++  :P



Yo utilizo algunas rutinas matemáticas, como de división o multiplicación para no enroscarme tanto. Sino te terminas cansando, renegando o frustrando. Otras si utilizo módulo I2C por ejemplo. Debo reconocer que hace mucho que no programo un uC, y mucho más en assembler. Los últimos 2 años el 90% de lo que hice, fue en CCS(y no he programado casi nada).

Saludos.

Saludos.
« Última modificación: 08 de Octubre de 2008, 16:10:25 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 PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: STATUS,C y STATUS,Z
« Respuesta #13 en: 09 de Octubre de 2008, 14:27:02 »
Aquí tengo una tablita a modo ilustrativo cuando programaba en ASM




es con la instrucción SUBWF


pd: ¿¡en serio dije cuando programaba en asm!?  :D



« Última modificación: 09 de Octubre de 2008, 17:14:57 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: STATUS,C y STATUS,Z
« Respuesta #14 en: 09 de Octubre de 2008, 14:48:42 »
Sino, siempre podés simularlo. Recién lo hice en el MPLAB y sostiene lo que digo :)

No hace falta Bruno,le creo plenamente.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.