Aqui te subo un código de ejemplo de restas entre REG1 y WREG.
Fijate como te quedan los resultados en el C y en el Z (no hagas caso al DC).
Aqui te pongo la tabla resultante si los datos en REG1 y WREG fueran los siguientes.
REG1 = registro definido en el software
w = Wreg
C, Z, DC: bits del STATUS
RESTA
; REG1 w C Z DC
; ----------------------------------------
; 4 2 1 0 1
; 4 4 1 1 1
; 4 6 0 0 0
;
Como observas si el C=0, luego el W era mayor que el REG1.
Si el C=1 REG1 es >= wreg y lo debes verificar leyendo el bit Z.
El código es válido para toda la familia 16F y 16C, al igual que para los 12F y 12C, solo hay que tener cuidado con la ubicacion de REG1.
;Rutinas matemáticas
list P=PIC16F84
#include p16f84.inc
;------------------------------------------------------------
; RESTA
;------------------------------------------------------------
;
; REG1 w C Z DC
; ----------------------------------------
; 4 2 1 0 1
; 4 4 1 1 1
; 4 6 0 0 0
;
org 0x00
REG1 equ 0x20
INICIO:
;--------------------------------
; Resta
; REG1 = 4
; W = 2
;--------------------------------
_REG_may:
bcf STATUS,C
bcf STATUS,Z
movlw .4
movwf REG1
movlw .2
subwf REG1,w ;REG1 > w
; C = 1
; Z = 0
nop
nop
;--------------------------------
; Resta
; REG1 = 4
; W = 4
;--------------------------------
_REG_igu:
bcf STATUS,C
bcf STATUS,Z
movlw .4
movwf REG1
movlw .4
subwf REG1,w ;REG1 = w
; C = 1
; Z = 1
nop
nop
;--------------------------------
; Resta
; REG1 = 4
; W = 6
;--------------------------------
_REG_men:
bcf STATUS,C
bcf STATUS,Z
movlw .4
movwf REG1
movlw .6
subwf REG1,w ;REG1 < w
; C = 0
; Z = 0
nop
nop
goto $-1
end
Si quieres restar el valor entre 2 registros, puedes cambiar el
movlw .4 por un
movf REG2,wSaludos