Salve a tutti, devo fare un programma in assembly 8086 dove all'interno di una stringa di bit conto il numero di transizioni da 0->1 e da 1->0
il programma è questo, il problema è che non mifunziona correttamente e non riesco capire il perché, premesso che in assembler non sono un asso, mi potreste dare una mano?
unsigned char vet[] = { 0xBC,0xFF,0x01 }; //Array di byte (da considerare come
//una sequenza di bit)
unsigned short int len = 18; //Lunghezza (numero di bit)
// Output
unsigned int transizioni01; //Numero di transizioni 0->1
unsigned int transizioni10; //Numero di transizioni 1->0
__asm
{
//azzeamento registri
XOR EAX, EAX
XOR EBX, EBX
XOR ECX, ECX
XOR EDX, EDX
XOR ESI, ESI
XOR EDI, EDI
MOV CX, len // inserisco nel registro ECX la lunghezza del vettore
// casi particolari
CMP ECX, 1
JNE L5
MOV transizioni01, 0
MOV transizioni10, 0
JMP fine2
L5:CMP ECX, 4
JNE L6
MOV transizioni01, 1
MOV transizioni10, 1
JMP fine2
L6: CMP ECX, 9
JNE L7
MOV transizioni01, 0
MOV transizioni10, 0
JMP fine2
L7: CMP ECX, 16
JNE L8
MOV transizioni01, 1
MOV transizioni10, 0
JMP fine2
L8 : CMP ECX, 17
JNE L4
MOV transizioni01, 1
MOV transizioni10, 1
JMP fine2
//ciclo generale
L4:
Ciclo : MOV AL, vet[ECX-1] // partendo dal fondo guardo tutti i numeri del vettore
MOV BL, AL // copio in BL AL
SHR BL, 1 //faccio lo shift a destra di 1 di BL
AND AL, 01
AND BL, 01
CMP AL, BL //comparo i due bit
JE L1 //se i due bit sono uguali termino il ciclo
CMP AL, 1 //guardo che AL=1 E BL=0
CMP BL, 0
JNE L2 //se BL è diverso 0 allora salto al caso successivo
INC EDX //in caso affermativvo incremento di uno il registro, per contare le transizioni
L2: CMP AL, 0 //comparo che AL=0 e BL=1
JNE L1 //se sono diversi termino l'esecuzione del ciclo per quel bit
CMP BL, 1
INC ESI //caso afferamtivo incremento il registro per contare una transizione
L1 :
LOOP Ciclo //ciclo che mi guarda dalla fine bit per bit gli elementi dell'array
//conteggi transizioni
MOV transizioni01, ESI
MOV transizioni10, EDX
fine2:
}
// Stampa su video
printf("Le transizioni 0->1 presenti sono: %d\n", transizioni01);
printf("Le transizioni 1->0 presenti sono: %d\n", transizioni10);