.MODEL small
.STACK 160h ; Lunghezza stack
.DATA ; Segmento dati
Lbyte EQU 8 ; N. bit del carattere
Len DW 05 ; Lunghezza stringa Vet
N DW 20 ; Numero di bit su cui calcolare il bit di parità (lung. pacchetto)
Error DB 0 ; 1=Errore di parità nella stringa; 0=ok
Vet DB 165 ; 5 chars da controllare (40 bit, 2 pacchetti)
DB 7DH
DB 6CH
DB 40H
DB 91H ; 1010 0101 0111 1101 0110 1100 0100 0000 1001 0001
.CODE ; Segmento codice
Begin:
start: nop ; start segmento codice
MOV AX,@DATA ; set up registro segmento dati
MOV DS,AX ;
MOV ES,AX ; set up ES
;---------------------------------------------------------------------------------------------------------------------------
MOV AH,00H ; Pulizia video
MOV AL,03H
INT 10H
;---------------------------------------------------------------------------------------------------------------------------
XOR SI,SI ; Azzera indice vettore SI
MOV CX,Len ; Lunghezza del vettore in CX
XOR BX,BX ; Azzera BX=contatore dei bit =1
XOR AX,AX ; AX=contatore bit esaminati nella stringa
XOR DH,DH ; e DH=contatore bit esaminati nel byte attuale
;---------------------------------------------------------------------------------------------------------------------------
Ciclo:
MOV DL,Vet[SI] ; Carica in DL un carattere dal vettore
L1:
CMP DH,Lbyte ; Se abbiamo elaborato un intero byte
JGE L3 ; passa al successivo
CMP AX,N ; Confronta contatore bit esaminati con N
JGE L2 ; Se AX >= N, N bit del frame già esaminati, salta a L2
INC AX ; altrimenti incrementa contatore bit esaminati in Vet
INC DH ; e contatore bit esaminati nel byte attuale
SHL DL,1 ; Assegna a CF il 1. bit a sinistra
JNC BitZero ; Se CF=0 va a BitZero per non incrementare BX
INC BX ; altrimenti incrementa il contatore dei bit =1
BitZero:
JMP L1 ; e va ad esaminare un altro bit
L2:
TEST BX,1 ; Verifica se contatore bit 1 è dispari
JNZ ErroreParità ; Se dispari, c'è un errore di parità
XOR AX,AX ; altrimenti riazzera contatore bit esaminati
JMP L1 ; e continua ad elaborare i restanti bit
L3:
INC SI ; Incrementa l'indice del vettore
XOR DH,DH ; Azzera contatore bit esaminati nel byte attuale
CMP AX,N ; Confronta contatore bit esaminati con N
JL L4 ; AX < N, ci sono ancora bit da esaminare nel pacchetto, salta a L4
XOR AX,AX ; altrimenti riazzera contatore bit esaminati
TEST BX,1 ; Verifica se contatore bit 1 è dispari
JNZ ErroreParità ; Se dispari, c'è un errore di parità
L4:
LOOP Ciclo ; Continua a meno che CX non sia 0
;---------------------------------------------------------------------------------------------------------------------------
MOV Error,30h ; Non ci sono errori di parità
JMP Fine ; Salta alla stampa
ErroreParità:
MOV Error,31h ; Trovato un errore di parità
;----------------------------------------------------------------------------------
Fine: MOV BH,00H ; Stampa risultato su pagina video 0
MOV AL,Error ; Byte da stampare in AL
MOV AH,0EH ; in modo TTY
INT 10H ; Interrupt Bios
;---------------------------------------------------------------------------------------------------------------------------
MOV AH,4CH ; Funzione per uscire al dos
INT 21H ; Esce al dos
END Begin
Visitano il forum: Nessuno e 1 ospite