# Comparar dos registros Mplab



## bygelogelo (Ene 12, 2011)

Hola compañeros, estoy realizando un proyecto en ensamblador con mplab y necesito hacer comparaciones entre dos registros, tambien necesito hacer comparaciones entre constantes y registros para las cuales no tengo ningun problema. Cuando realizo las comparaciones entre constantes y registros hago lo siguiente:

      movlw      b'11110000'     ;muevo la constante a W
      xorwf       registro,w        ;si son iguales status,z =1 si no, z=0
      btfss        status,z          ; testeo z para ver su estado 
      goto        diferente
      goto        igual

hasta aqui todo bien, pero cuando se necesito comparar registro con registro, esto no funcionaria ya que en el datasheet en la instruccion xorwf ó subwf tiene una restriccion que es: 0<=f<=127, lo que quiere decir que el registro no debe ser mayor a 127 y normalmente uso registros que se incrementan ó cambian a datos mayores a 127.

espero estar equivocado y que alguien me pueda ayudar. gracias de antemano. saludos.


----------



## fdesergio (Ene 12, 2011)

Podes hacerlos siplemente restando los 2 registros, si Z=0 entonces son diferentes , si Z=1 entonces iguales, chauuuuuuu

de todas maneras en la pagina de Microchip hay notas de aplicacion para comparar 2 regs, y determinar si es igual, mayor o menor que, chauuuuuuuuuu


----------



## bygelogelo (Ene 12, 2011)

ok muchas gracias por responder, tambien con subwf tiene la misma restriccion donde 0<=f<=127, he buscado en microchip pero no he encontrado esas notas de aplicacion. alguna liga que me puedan pasar. 

ya probé con subwf y xorwf pero me retorna datos erroneos.

muchas gracias.


----------



## fdesergio (Ene 12, 2011)

No veo porque tenga esa restriccion, si en un reg se puede restar por ejemplo 220 de 240 , donde esta eso de que hablas mostranos a ver que es, Ok?


----------



## bygelogelo (Ene 12, 2011)

ok en la pagina No. 165 seccion *15.0 INSTRUCTION SET SUMMARY. anexo un dato adjunto donde se muestra la restriccion.*

*saludos
*

igual para subwf adjunto su imgen


----------



## gzaloprgm (Ene 12, 2011)

Lo que dice F es el índice del registro, no el valor del registro en sí.

Los registros son de 8 bits, por lo que pueden representar datos entre 0 y 255.

La resta anda bien con cualquier numero que entre ahí.


----------



## Meta (Ene 13, 2011)

Hola:


```
[COLOR=#006600][COLOR=#006600];**********************************************************************
[COLOR=#006600];                      AqueronteBlog@gmail.com                        *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];   Este archivo es propiedad intelectual del blog Aqueronte,         *[/COLOR]
[COLOR=#006600];   cuya dirección web, es la siguiente:                              *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];                   http://unbarquero.blogspot.com/                   *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];   Se permite cualquier modificación del archivo siempre y cuando    *[/COLOR]
[COLOR=#006600];   se mantenga la autoría del autor.                                 *[/COLOR]
[COLOR=#006600];                                                                     *
;   El autor no se responsabiliza de las consecuencias que pueda      *
;   ocasionar éste código debido a un uso inadecuado del mismo.       *
[/COLOR][COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Filename:      Ejemplo2.asm                                      *[/COLOR]
[COLOR=#006600];    Date:          6-Octubre-08                                      *[/COLOR]
[COLOR=#006600];    File Version:  vs0.0                                             *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Author:        Manuel Caballero                                  *[/COLOR]
[COLOR=#006600];    Company:       Hades                                             *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Files Required: P16F628A.INC                                     *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Notes: Manejar instrucciones de operaciones.                     *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];**********************************************************************[/COLOR]

[COLOR=#000099]   list[/COLOR]      [COLOR=#330033]p=16F628A[/COLOR]             [COLOR=#006600]; Directiva para definir el procesador[/COLOR]
[COLOR=#000099]   #include[/COLOR] < [COLOR=#330033]p16F628A.inc[/COLOR] >   [COLOR=#006600]    ; Registros especificas del procesador[/COLOR]

[COLOR=#000099]   __CONFIG   [COLOR=#330033]_BOREN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT[/COLOR][/COLOR]
[COLOR=#006600][/COLOR]
[COLOR=#006600]; _BOREN_OFF:               Reset por Brown-out DESACTIVADO.
; _CP_OFF:                  Protección de código DESACTIVADO.
; _DATA_CP_OFF:             Protección de datos DESACTIVADO.
; _PWRTE_ON:                Retraso al reset ACTIVADO.[/COLOR]
[COLOR=#006600][COLOR=#006600]; _WDT_OFF:                 Watchdog DESACTIVADO.
; _LVP_OFF:                 Programación en bajo voltaje DESACTIVADO.
; _MCLRE_ON:                Pin de reset externo ACTIVADO.
; _INTOSC_OSC_NOCLKOUT:     Oscilador interno sin salida CLK.[/COLOR][/COLOR]
[COLOR=#006600];***** DEFINICIÓN DE VARIABLES[/COLOR]
[COLOR=#000099][/COLOR]       [COLOR=#000099]CBLOCK[/COLOR]   [COLOR=#000066]0x20   [COLOR=#006600]; Inicio dirección memoria de datos del Banco 0[/COLOR][/COLOR]
  [COLOR=#330033]     Numero[/COLOR]
[COLOR=#000099]      ENDC[/COLOR]

[COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#000099]       ORG     0x000 [/COLOR]      [COLOR=#006600]; Inicio de código[/COLOR]
      [COLOR=#000099] bsf[/COLOR]     [COLOR=#663366]STATUS,RP0[/COLOR]  [COLOR=#006600]; Banco 1[/COLOR]
     [COLOR=#000099]  bsf [/COLOR]    [COLOR=#663366]PCON,OSCF[/COLOR]   [COLOR=#006600]; Oscilador interno a 4MHz[/COLOR]
     [COLOR=#000099]  bcf[/COLOR]     [COLOR=#663366]STATUS,RP0[/COLOR]  [COLOR=#006600]; Banco 0[/COLOR]
[COLOR=#006600]      [COLOR=#000066] goto[/COLOR]    [COLOR=#663366]Inicio[/COLOR]      ; Salta a programa principal

[/COLOR][COLOR=#006600][COLOR=#000099]       ORG     0x0004      [COLOR=#006600]; Vector de Interrupción[/COLOR][/COLOR][/COLOR][COLOR=#006600]; El vector de interrupción se encuentra en la dirección 0x0004
; En este ejemplo no se usará interrupciones.
[COLOR=#000099]        retfie[/COLOR]
[/COLOR]
[COLOR=#663366]Inicio[/COLOR]
[COLOR=#000066]      [COLOR=#000099] movlw   0x03[COLOR=#330033][/COLOR]       [COLOR=#006600]; 3 -> (W)[/COLOR][/COLOR] [COLOR=#000099]
       movwf   [COLOR=#330033]Numero[/COLOR]     [COLOR=#006600]; (W) -> Numero[/COLOR] [/COLOR]

[COLOR=#663366]Bucle_Dec[/COLOR]
[COLOR=#000099]       decfsz [COLOR=#663366]Numero,F[/COLOR]  [COLOR=#006600]; --Numero, Salta si Numero = 0[/COLOR]
       goto [COLOR=#663366]Bucle_Dec[/COLOR]   [COLOR=#006600]; Si Numero != 0 vuelve a Bucle_Dec[/COLOR]

       subwf [COLOR=#663366]Numero,F[/COLOR]   [COLOR=#006600]; Numero = Numero - W[/COLOR]

[COLOR=#663366]Bucle_Inc[/COLOR]
      incfsz [COLOR=#663366]Numero,F[/COLOR]  [COLOR=#006600]; ++Numero, Salta si Numero = 0[/COLOR]
       goto [COLOR=#663366]Bucle_Inc[/COLOR] [COLOR=#006600]  ; Si Numero != 0 vuelve a Bucle_Inc[/COLOR][/COLOR][COLOR=#000099]
[COLOR=#006600][/COLOR][/COLOR][COLOR=#330033][COLOR=#000099][/COLOR][/COLOR][COLOR=#000099]
       goto    [COLOR=#663366]Inicio[/COLOR][/COLOR][/COLOR]   [COLOR=#006600]; Vuelve a Inicio[/COLOR]

[COLOR=#000099]       END[/COLOR]              [COLOR=#006600]; directiva 'fin de programa'[/COLOR][/COLOR][/COLOR]
```

Para la realización de este programa, se ha empleado una variable  definida en memoria RAM. Para tal propósito, se ha usado la instrucción:

*cblock---endc*​
En este caso, el PIC 16F628A comienza la dirección de memoria de datos en la dirección *0x20*, se declarará la variable *Numero*.

El  propósito de este programa es familiarizarse con las instrucciones de  programación en lenguaje ensamblador, donde se usará instrucciones que  serán comunes en nuestros códigos.

En este programa se muestra  como se utilizan las instrucciones de decremento e incremento con  posibilidad de salto y también se muestra como usar la instrucción de  resta entre un registro y W.


Para ver el resultado, compilamos el código y seleccionamos el MPLAB SIM para poder simularlo.

Abrimos la ventana de _Watch_ y seleccionamos en la categoría de _Symbol_ la variable definida como _Numero_, y el la categoría de _SFR_, el registro _WREG_.

Simulamos el código paso a paso.

Se puede apreciar como el valor de la constante se almacena en el registro de trabajo W, después se iniciará la variable _Numero_ con el valor contenido en W, y a partir de ahí, el programa decrementa la variable _Numero_ hasta que sea cero su valor, posteriormente, se incrementara dicha variable hasta que sea cero su valor.






http://unbarquero.blogspot.com/2008/10/mid-range-pic-ejemplo-2.html

http://unbarquero.blogspot.com/2008/07/subwf.html

Saludo.


----------



## bygelogelo (Ene 13, 2011)

ok esta bien, muchas gracias por su ayuda y amabilidad. me ha servido mucho esa informacion.
saludos.


----------



## loml504 (Dic 15, 2013)

He intentando comparar valores de distintas formas, para que salten a subrutinas como lo hace la instrucción if pero ninguna me ha funcionado;ninguno de los programas salta donde yo quiero, estoy usando el mplab, estos son los códigos que he usado:


```
programa1:
    movlw     04H
    movwf     cnt
    movlw     05H
    movwf     cn

    movf     cnt,w
    subwf     cn,W
    btfss     STATUS,C
    goto    carry_es0 
    goto     carry_es1
carry_es0
decf cnt
return

carry_es1
incf cnt
return

;**********************************************
programa2:

movlw 26h
movwf cnt

MOVLW 26H; carga el acumulador con el valor a comparar.
XORWf cnt,w ; compara el acumulador con NUMERO.
BTFSS STATUS, Z ; salta la instrucción siguiente si XOR = 0.
GOTO DISTINTO ; salta a DISTINTO si XOR no es 0.
GOTO IGUAL ; salta a IGUAL.

IGUAL:
decf cnt

DISTINTO:
incf cnt
```


----------



## MrAlphonse (Ene 7, 2014)

Intenta revisando el estado del bit Z (zero) y recuerda declarar tus  variables en la seccion de memoria adecuada (CBLOCK).


```
MOVF	REGISTRO_A,W	;REGISTRO 'A' A COMPARAR, ES RESTADO DEL REGISTRO 'B',
	SUBWF	REGISTRO_B,0	;EL RESULTADO SE GUARDA EN W, PARA NO AFECTAR NINGUNO DE LOS REGISTROS
	BTFSS	STATUS,Z	;REVISAMOS EL ESTADO DEL BIT Z (ZERO), SI EL RESULTADO ES CERO
	GOTO	NO_IGUALES	;QUIERE DECIR QUE AMBOS REGISTROS SON IGUALES
IGUALES
	;PON TU RUTINA DE IGUALES
	;...
	;...
	;TERMINA TU RUTINA CON UN 'RETURN' PARA FINALIZAR ESTA RUTINA Y REGRESAR UN VALOR
	;O CON UN 'GOTO' PARA IR A OTRA RUTINA

NO_IGUALES
	;PON TU RUTINA DE NO IGUALES
	;...
	;...
	;TERMINA TU RUTINA CON UN 'RETURN' PARA FINALIZAR ESTA RUTINA Y REGRESAR UN VALOR
	;O CON UN 'GOTO' PARA IR A OTRA RUTINA
```


----------



## migu3l705 (Nov 17, 2014)

LOL amigos yo tambien tenia el mismo problema pero era porqué usaba MOVLW para cargar un registro en  W y por esos no me lo leía bien, aqui dejo un codigo que si me funciono para comparar dos registros:

MOVF	 CONTAR1,W; MUEVO CONTAR1 A W
	XORWF	CONTAR2,0  ;USO XORWF PARA HACER UNA OPERACION XOR SOBRE CONTAR2 Y W
	BTFSC	STATUS,2    ; EL RESULTADO DEL XOR SE GUARDA EN Z QUE ES EL BIT 2 DE STATUS
	GOTO	 IGUAL
	GOTO DIFERENTE


----------

