#include <stdio.h>
void main()
{
// Input
unsigned char vet[] = { 0xE3, 0xA5, 0x0E, 0x92, 0x2F, 0xB2, 0x00 };
unsigned int len = 50; // lunghezza (numero di bit)
unsigned char n = 4; // numero di bit dati
// Ouput
unsigned char errori=0; // 1 = errori; 0 = no errori
__asm
{
XOR EAX, EAX // Conatore generale, che dividerÚ per verifiche
XOR EBX, EBX // Valore del vet[] prelevato
XOR ECX, ECX // Scorrere array
XOR EDX, EDX // Per virificare resto divisioni
MOV errori, 0 // Parit‡ diparit‡ di n bit
ADD n, 1
Salto3: MOV BL, vet[ECX]
Salto2: TEST BL, 1
JZ Salto1
XOR errori, 1
Salto1: SHR BL, 1
INC EAX
VerificaByte: CMP EAX, 8
JL VerificaN
XOR EDX, EDX
ContinuaByte: SUB EAX, 8
INC EDX
CMP EAX, 8
JGE ContinuaByte
CMP EAX, 0
JE RipristinaByteS
JNE RipristinaByteN
RipristinaByteS:ADD EAX, 8
DEC EDX
CMP EDX, 0
JNE RipristinaByteS
INC ECX
MOV BL, vet[ECX]
JMP VerificaN
RipristinaByteN:ADD EAX, 8
DEC EDX
CMP EDX, 0
JNE RipristinaByteN
VerificaN: CMP AL, n
JL Salto2
CWD
DIV n
CMP AH, 0
JE VerificaBit
MOV DL, AH
MUL n
ADD AL, DL
CMP EAX, len
JE FineNoErrori
JNE Salto2
PostVerifica : MOV DL, AH
MUL n
ADD AL, DL
INC EAX
SHR BL, 1
MOV errori, 0
CMP EAX, len
JE FineNoErrori
JNE Salto2
La soluzione che ho implementato è questa, in breve copio in BL i primi 8 bit ( il primo intero ) e poi con SHR e TEST verifico se il primo bit a dx è a 1, li conto e verifico che il bit n+1 sia 0 se i bit precedentemente contati sono pari altrimenti deve essere 1...
VerificaBit: CMP errori, 1
JE Dispari
JNE Pari
Dispari: TEST BL, 1
JZ FineSiErrori
JNZ PostVerifica
Pari: TEST BL, 1
JZ PostVerifica
JNZ FineSiErrori
FineSiErrori: MOV errori, 1
JMP Fine
FineNoErrori: MOV errori, 0
Fine:
}
// Stampa su video
printf("La sequenza di bit %scontiene errori\n",(errori?"":"non "));
}