PDA

Visualizza la versione completa : [Assembly] Calcolo transizioni bit


Andres7X
22-06-2009, 10:04
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:



#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);
}


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).

Loading