- 23 mar 2015, 09:51
#43
E' comodo avere già pronte le istruzioni necessarie per effettuare comparazioni in Assembly, sopratutto sui PIC Baseline che non dispongono degli opcodes sublw e addlw.
Le comparazioni ><= sono realizzate solamente con addwf e subwf e con il complemento a 1 (o a 2) delle costanti (literal). Le eguaglianze o diseguaglianze sono realizzate con xorwf.
Le macro sono in forma di pseudo mnemonici vagamente simili a quelli di 8051.
Sono divise in tre gruppi:
- compare and skip next line
- compare and jump to address
- branch e skip su WREG
Il file si associa alla compilazione con un #include all' inizio del sorgente. Le macro non utilizzano locazioni di RAM dati.
Le comparazioni ><= sono realizzate solamente con addwf e subwf e con il complemento a 1 (o a 2) delle costanti (literal). Le eguaglianze o diseguaglianze sono realizzate con xorwf.
Le macro sono in forma di pseudo mnemonici vagamente simili a quelli di 8051.
Sono divise in tre gruppi:
- compare and skip next line
- compare and jump to address
- branch e skip su WREG
Il file si associa alla compilazione con un #include all' inizio del sorgente. Le macro non utilizzano locazioni di RAM dati.
Codice: Seleziona tutto
;********************************************************************
; compmacro.asm
;--------------------------------------------------------------------
;
; Titolo : Macro per comparazioni a 8 bit.
; Set istruzioni del core 12-bit.
; Eseguibili su tutti i PIC a 8 bit.
; PIC : Baseline, Mid, 18F
; Supporto : MPASM
; Versione : V.1.0
; Data : 01-05-2013
; Ref. hardware :
; Autore : afg
;
;--------------------------------------------------------------------
NOLIST ; blocca lista per non appesantire il file .lst
;--------------------------------------------------------------------
; ******************** Lista delle Macro ****************************
; Compara e vai a indirizzo
;
; CFLJA Compare File to Literal and Jump if Above
; CFLJA file,literal,addr file > literal goto addr
;
; CFFJA Compare File to File and Jump if Above
; CFFJA file1,file2,addr file1 > file2 goto addr
;
; CFLJAE Compare File to Literal and Jump if Above or Equal
; CFLJAE file,literal,addr file >= literal goto addr
;
; CFFJAE Compare File to File and Jump if Above or Equal
; CFFJAE file1,file2,addr file1 >= file2 goto addr
;
; CFLJB Compare File to Literal and Jump if Below
; CFLJB file,literal,addr file < literal goto addr
;
; CFFJB Compare File to File and Jump if Below
; CFFJB file1,file2,addr file1 < file2 goto addr
;
; CFLJBE Compare File to Literal and Jump if Below or Equal
; CFLJBE file,literal,addr file <= literal goto addr
;
; CFFJBE Compare File to File and Jump if Below or Equal
; CFFJBE file1,file2,addr file1 <= file2 goto addr
;
; CFLJE Compare File to Literal and Jump if Equal
; CFLJE file,literal,addr file = literal goto addr
;
; CFFJE Compare File to File and Jump if Equal
; CFFJE file1,file2,addr file1 = file2 goto addr
;
; CFLJNE Compare File to Literal and Jump if Not Equal
; CFLJNE file,literal,addr file <> literal goto addr
;
; CFFJNE Compare File to File and Jump if Not Equal
; CFFJNE file1,file2,addr file1 <> file2 goto addr
;
; Compara e salta riga successiva
;
; CFLSA Compare File to Literal and Skip if Above
; CFLSA file,literal,addr file > literal goto addr
;
; CFFSA Compare File to File and Skip if Above
; CFFSA file1,file2,addr file1 > file2 goto addr
;
; CFLSAE Compare File to Literal and Skip if Above or Equal
; CFLSAE file,literal,addr file >= literal goto addr
;
; CFFSAE Compare File to File and Skip if Above or Equal
; CFFSAE file1,file2,addr file1 >= file2 goto addr
;
; CFLSB Compare File to Literal and Skip if Below
; CFLSB file,literal,addr file < literal goto addr
;
; CFFSB Compare File to File and Skip if Below
; CFFSB file1,file2,addr file1 < file2 goto addr
;
; CFLSBE Compare File to Literal and Skip if Below or Equal
; CFLSBE file,literal,addr file <= literal goto addr
;
; CFFSBE Compare File to File and Skip if Below or Equal
; CFFSBE file1,file2,addr file1 <= file2 goto addr
;
; CFLSE Compare File to Literal and Skip if Equal
; CFLSE file,literal,addr file = literal goto addr
;
; CFFSE Compare File to File and Skip if Equal
; CFFSE file1,file2,addr file1 = file2 goto addr
;
; CFLSNE Compare File to Literal and Skip if Not Equal
; CFLSNE file,literal,addr file <> literal goto addr
;
; CFFSNE Compare File to File and Skip if Not Equal
; CFFSNE file1,file2,addr file1 <> file2 goto addr
;
;
; RANGECHK Verifica valore di un regsitro se compreso tra min e max
; RANGECHK file,min,max min<file1<max C=1
;
; Branch sul valore di W
;
; BW Branch destination if W !=0
; BW dest
; BNW Branch destination if W=0
; BWNZ dest
; SKPW Skip next line if W !=0
; SKPW dest
; SKPNW Skip next line if W =0
; SKPNW dest
;
;--------------------------------------------------------------------
; per tutte le comparazioni: Words:4 Cicli:4 (5 se jump)
; Status: C, DC, Z
;--------------------------------------------------------------------
;####################################################################
;--------------------------------------------------------------------
; JUMP TO ADDRESS IF...
;--------------------------------------------------------------------
; per tutte : Words: 3 Cicli: 3 (4 se jump) Status: C, DC, Z
;
;********************************************************************
; CFLJA Compare File to Literal and Jump if Above
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file > literal
CFLJA MACRO file,lit,addr
movlw (255-lit) ; W = ~lit
addwf file,W ; W = f + W = f + ~lit
skpnc ; C=0 se f<=lit, salta prossima riga
goto addr ; C=1 se f>lit, vai a indirizzo
ENDM
;********************************************************************
; CFFJA Compare File to File and Jump if Above
; Compara il contenuto di un registro con quello di un altro
; e va a indirizzo se file1>file2
CFFJA MACRO file1,file2,addr
movf file1,W ; W = f1
subwf file2,W ; W = f2 - W = f2 - f1
skpc ; C=1 se f2>=f1, salta prossima riga
goto addr ; C=0 se f2<f1 (f1>f2), vai a indirizzo
ENDM
;********************************************************************
; CFLJAE Compare File to Literal and Jump if Above or Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file>=literal
CFLJAE MACRO file,lit,addr
movlw lit ; W = lit
subwf file,w ; W = f - W = f - lit
skpnc ; C=0 se f<lit, salta prossima riga
goto addr ; C=1 se f>=lit, vai a indirizzo
ENDM
;********************************************************************
; CFFJAE Compare File to File and Jump if Above or Equal
; Compara il contenuto di un registro con quello di un altro
; e va a indirizzo se file1 >= file2
CFFJAE MACRO file,lit,addr
movf file2,W ; W = f2
subwf file1,W ; W = f1 - W = f1 - f2
skpnc ; C=0 se f1<f2, salta prossima riga
goto addr ; C=1 se f1>=f2, vai a indirizzo
ENDM
;********************************************************************
; CFLJB Compare File to Literal and Jump if Below
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file<literal
CFLJB MACRO file,lit,addr
movlw lit ; W = lit
subwf file,W ; W = f - W = f -lit
skpc ; C=1 se f>=lit, salta prossima riga
goto addr ; C=0 se f<lit, vai a indirizzo
ENDM
;********************************************************************
; CFFJB Compare File to File and Jump if Below
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1<file2
CFFJB MACRO file1,file2,addr
movf file2,W ; W = f2
subwf file1,W ; W = f1 - W = f1 - f2
skpc ; C=1 se f1>=f2, salta prossima riga
goto addr ; C=0 se f1<f2, vai a indirizzo
ENDM
;********************************************************************
; CFLJBE Compare File to Literal and Jump if Below or Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file<=literal
CFLJBE MACRO file,lit,addr
movlw (255-lit) ; W = ~lit
addwf file,W ; W = f + W = f + ~lit
skpc ; C=1 se f>lit, salta prossima riga
goto addr ; C=0 se f<=lit, vai a indirizzo
ENDM
;********************************************************************
; CFFJBE Compare File to File and Jump if Below or Equal
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1<=file2
CFFJBE MACRO file1,file2,addr
movf file1,W ; W = f1
subwf file2,W ; W = f2 - W = f2 - f1
skpnc ; C=0 se f2<f1, salta prossima riga
goto addr ; C=1 se f2>=f1 (f1<=f2), vai a indirizzo
ENDM
;********************************************************************
; CFLJE Compare File to Literal and Jump if Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file = literal
CFLJE MACRO file,lit,addr
movlw lit ; W = lit
xorwf file,W ; W = f - W = f - lit
skpnz ; Z=1 se f<>lit, salta prossima riga
goto addr ; Z=0 se f=lit, vai a indirizzo
ENDM
;********************************************************************
; CFFJE Compare File to File and Jump if Equal
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1 = file2
CFFJE MACRO file1,file2,addr
movf file2,W ; W = f2
xorwf file1,W ; W = f1 - W = f1 - f2
skpnz ; Z=1 se f1<>f2, salta prossima riga
goto addr ; Z=0 se f1=f2, vai a indirizzo
ENDM
;********************************************************************
; CFLJNE Compare File to Literal and Jump if Not Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file <> literal
CFLJNE MACRO file,lit,addr
movlw lit ; W = lit
xorwf file,W ; W = f - W = f - lit
skpz ; Z=1 se f=lit, salta prossima riga
goto addr ; Z=0 se f<>lit, vai a indirizzo
ENDM
;********************************************************************
; CFFJE Compare File to File and Jump if Not Equal
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1 <> file2
CFFJNE MACRO file1,file2,addr
movf file2,W ; W = f2
xorwf file1,W ; W = f1 - W = f1 - f2
skpz ; Z=1 se f1=f2, salta prossima riga
goto addr ; Z=0 se f1<>f2, vai a indirizzo
ENDM
;####################################################################
;--------------------------------------------------------------------
; SKIP NEXT LINE IF....
;--------------------------------------------------------------------
; per tutte : ; Words: 3 Cicli: 3 (4 se jump) Status: C, DC, Z
;
;********************************************************************
; CFLSA Compare File to Literal and Skip if Above
; Compara il contenuto di un registro con un numero e salta
; se file>literal
CFLSA MACRO file,lit
movlw ~lit ; W = ~lit
addwf file,W ; W = f + W = f - lit
skpc ; C=1 se f>lit, salta prossima riga
ENDM ; C=0 se f<=lit, esegui prossima riga
;********************************************************************
; CFFSA Compare File to File and Skip if Above
; Compara il contenuto di un registro con quello di un altro
; e salta se file1>file2
CFFSA MACRO file1,file2
movf file1,W ; W = f1
subwf file2,W ; W = f2 - W = f2 - f1
skpnc ; C=0 se f2<f1 (f1>f2), salta prossima riga
ENDM ; C=1 se f1<=f2, esegui prossima riga
;********************************************************************
; CFLSAE Compare File to Literal and Skip if Above or Equal
; Compara il contenuto di un registro con un numero e salta
; se file >= literal
CFLSAE MACRO file,lit
movlw lit ; W = lit
subwf file,w ; W = f - W = f -lit)
skpc ; C=1 se f>=lit, salta prossima riga
ENDM ; C=0 se f<lit, esegui prossima riga
;********************************************************************
; CFFSAE Compare File to File and Skip if Above or Equal
; Compara il contenuto di un registro con quello di un altro
; e salta se file1>=file2
CFFSAE MACRO file1, file2
movf file2,W ; W = f2
subwf file1,W ; W = f1 - W = f1 - f2
skpc ; C=1 se f1>=f2, salta prossima riga
ENDM ; C=0 se f1<f2, esegui prossima riga
;********************************************************************
; CFLSB Compare File to Literal and Skip if Below
; Compara il contenuto di un registro con un numero e salta
; se file<literal
CFLSB MACRO file,lit
movlw lit ; W = lit
subwf file,W ; W = f - W = f - lit
skpnc ; C=0 se f<lit, skip prossima riga
ENDM ; C=1 se f>=lit, esegui prossima riga
;********************************************************************
; CFFSB Compare File to File and Skip if Below
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1<file2
CFFSB MACRO file1,file2
movf file2,W ; W = f2
subwf file1,W ; W = f1 - W = f1 - f2
skpnc ; C=0 se f1<f2, skip prossima riga
ENDM ; C=1 se f1>=f2, esegui prossima riga
;********************************************************************
; CFLSBE Compare File to Literal and Skip if Below or Equal
; Compara il contenuto di un registro con un numero e salta
; se file <= literal
CFLSBE MACRO file,lit
movlw (255-lit) ; W = ~lit
addwf file,W ; W = f + W = f + ~lit
skpnc ; C=0 se f<=lit, skip prossima riga
ENDM ; C=1 se f>lit, esegui prossima riga
;********************************************************************
; CFFSBE Compare File to File and Skip if Below or Equal
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1 <= file2
CFFSBE MACRO file1,file2
movf file1,W ; W = f1
subwf file2,W ; W = f2 - W = f2 - f1
skpc ; C=1 se f2>=f1 (f1<=f2), skip prossima riga
ENDM ; C=0 se f1<f2, esegui prossima riga
;********************************************************************
; CFLSE Compare File to Literal and Skip if Equal
; Compara il contenuto di un registro con un numero e salta
; se file = literal
CFLSE MACRO file,lit
movlw lit ; W = literal
xorwf file,W ; W = file - W = file - literal
skpz ; Z=1 se file=lit, skip prossima riga
ENDM ; Z=0 se file1<>lit, esegui prossima riga
;********************************************************************
; CFFSE Compare File to File and Skip if Equal
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1 = file2
CFFSE MACRO file1,file2
movf file2,W ; W = file2
xorwf file1,W ; W = file1 - W = file1 - file2
skpz ; Z=1 se file1=file2, skip prossima riga
ENDM ; Z=0 se file1<>file2, esegui prossima riga
;********************************************************************
; CFLSNE Compare File to Literal and Skip if Not Equal
; Compara il contenuto di un registro con un numero e salta
; se file <> literal
CFLSNE MACRO file,lit
movlw lit ; W = lit
xorwf file,W ; W = file - W = file - lit
skpnz ; Z=0 se file <> lit, skip prossima riga
ENDM ; Z=1 se file1=lit, esegui prossima riga
;********************************************************************
; CFFSE Compare File to File and Skip if Not Equal
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1 <> file2
CFFSNE MACRO file1,file2
movf file2,W ; W = file2
xorwf file1,W ; W = file1 - W = file1 - file2
skpnz ; Z=0 se file1<>file2, skip prossima riga
ENDM ; Z=1 se file1=file2, esegui prossima riga
;####################################################################
;--------------------------------------------------------------------
;********************************************************************
; TEST SU W
;--------------------------------------------------------------------
; BNW Branch on W=0
BNW MACRO dest
iorlw 0 ; OR con 0, W resta inalterato
skpnz ; se Z=0, W !=0, salta prossima riga
goto dest ; se Z=1, W=0 , vai a dest
ENDM
; BW Branch on W != 0
BW MACRO dest
iorlw 0 ; OR con 0, W resta inalterato
skpz ; se Z=1, W =0 , salta prossima riga
goto dest ; se Z=0, W !=0 , vai a dest
ENDM
; SKPNW Skip on W = 0
SKPNW MACRO dest
iorlw 0 ; OR con 0, W resta inalterato
skpz ; se Z=1, W =0 , salta prossima riga
; se Z=0, W !=0 , esegui prossima riga
ENDM
; SKPW Skip on W != 0
SKPW MACRO dest
iorlw 0 ; OR con 0, W resta inalterato
skpnz ; se Z=0, W !=0 , salta prossima riga
; se Z=1, W =0 , esegui prossima riga
ENDM
subwf max,w ; W = file - W = file - max
exit ; esce con C=1 se nei limiti
ENDM
LIST ; ripristina stampa della lista