Vi espongo il problema: dato un array di byte, devo calcolare il numero di transizioni 0->1.
Ho scritto questo programma, ma un assemblatore online mi dice che non vale per tutti i casi:
Che ne pensate? A me sembra tutto corretto (il fatto che parti di codice siano ripetute è perchè non trovo altri metodi, e comunque per ora non mi interessa l'ottimizzazione del codice ma il fatto di risolvere il problema).codice:#include <stdio.h> void main() { // Input unsigned char vet[] = {0xAA, 0xFC, 0x09}; // Array di byte (da considerare come una sequenza di bit) unsigned short int len = 19; // Lunghezza (numero di bit) // Output unsigned int transizioni; // Numero di transizioni __asm { XOR EDX,EDX ; Azzeriamo EDX MOV AX,len ; Copiamo la lunghezza della stringa in AX XOR ESI,ESI ; Azzeriamo ESI Cambia: MOV BL,vet[ESI] ; Copiamo in BL la stringa con indice indicato da ESI MOV ECX,8 ; Copiamo in ECX la lunghezza di un byte Scorri: JMP Contr ; Controlliamo se si azzerano i registri contatori Rit: SHL BL,1 ; Scorriamo la stringa DEC AX ; Decrementiamo AX DEC ECX ; Decrementiamo ECX JNC Scorri ; Se non c è riporto, scorriamo per cercare un 1 CMP AX,18 JE Scorri ; Se troviamo un bit 1 al primo shift, non possiamo contarlo come transizione INC EDX ; Incrementiamo il numero di transizioni Scorri2:CMP AX,0 JE Fine CMP ECX,0 JE Cambia2 ; Controllo dei registri contatori SHL BL,1 DEC AX DEC ECX JC Scorri2 ; Scorriamo finchè non ritroviamo uno 0 Contr: CMP AX,0 JE Fine ; Se AX è 0, abbiamo raggiunto il 19° bit CMP ECX,0 JE Cambia2 ; Se ECX è 0, abbiamo scorso tutto il byte, quindi possiamo cambiare stringa JMP Rit Cambia2:INC ESI ; Incrementiamo l indice del vettore JMP Cambia Fine: MOV transizioni,EDX ; Salviamo il numero di transizioni nell apposita variabile } // Stampa su video printf("Le transizioni 0->1 presenti sono: %d\n", transizioni); }

Rispondi quotando