Aiuto esercizio sulla parità e disparità Assembly

di il
2 risposte

Aiuto esercizio sulla parità e disparità Assembly

Ciao a tutti, ho bisogno di una aiuto con il seguente esercizio....
Questo è il testo: Data una sequenza di bit, sapendo che ogni n bit (di dati) vi è un bit di parità (1 se il numero di bit a 1 fra i precedenti n è dispari), verificare se vi sono errori.
Input: un’array di BYTE (da considerare come una sequenza di bit), una DWORD (la lunghezza della sequenza di bit), un BYTE (il valore n)
Output: un BYTE (contenente 1 se vi sono errori, altrimenti 0)
N.B.
• viene specificata in input la lunghezza in bit: può quindi accadere che l’ultimo BYTE dell’array sia utilizzato solo in parte.
• Si può supporre che la lunghezza della sequenza di bit sia sempre multipla di (n+1).
• I bit all’interno di un BYTE devono essere analizzati dal meno significativo al più significativo.

Questo è lo schema da utilizzare per l'esercizio:

/********************************************************************************

Elaborato 3
Descrizione: Data una sequenza di bit, sapendo che ogni n bit (di dati) vi Ë
un bit di parit‡ (1 se il numero di bit a 1 fra i precedenti n Ë
dispari), verificare se vi sono errori.

********************************************************************************/

#include <stdio.h>

void main()
{
// Input
unsigned char vet[]={2,4,67,2,2,58,99};
unsigned int len = 55; // lunghezza (numero di bit)
unsigned char n = 4; // numero di bit dati

// Ouput
unsigned char errori=0; // 1 = errori; 0 = no errori

__asm
{

}

// Stampa su video
printf("La sequenza di bit %scontiene errori\n",(errori?"":"non "));
}

Il testo dell'esercizio è abbastanza chiaro ma nelle soluzioni che ho implementato non riesco mai ad arrivare alla giusta soluzione...
qualcuno riesce ad aiutarmi ?

2 Risposte

  • Re: Aiuto esercizio sulla parità e disparità Assembly

    E le tue soluzioni quali sono? Mostrale e descrivile ...
  • Re: Aiuto esercizio sulla parità e disparità Assembly

    #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 "));
    }
Devi accedere o registrarti per scrivere nel forum
2 risposte