ASSEMBLY 8086

di il
6 risposte

ASSEMBLY 8086

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

6 Risposte

  • Re: ASSEMBLY 8086

    Perché questo valore ?

    unsigned short int len = 18; //Lunghezza (numero di bit)
  • Re: ASSEMBLY 8086

    E il numero di bit come scritto, valore non dato da me, ma dal professore
  • Re: ASSEMBLY 8086

    Ma la sequenza è di 24 bit ... quali di questi devi considerare ? I primi 18 o gli ultimi ?

    E comunque spiega il criterio che hai seguito perché non si capisce quello che fai ...
  • Re: ASSEMBLY 8086

    Nella consegna presentata dal professore non ci e stato detto.
    nel programma semplicemente scorro il vettore, che va in AL, il quale contenuto copio in BL che poi shifto a destra, confrontando così i due bit
    poi se questi sono uguali salto alla fine e riparte il ciclo con il successivo. se invece prosegue comparo che AL sia uguale a 0 nel caso incremento il registro dedicato altrimenti salta al caso successivo e comparo AL che sia uguale a 1 e incremento in caso affermativo il registro dedicato
  • Re: ASSEMBLY 8086

    Direi che è tutto abbastanza "sbagliato" o, comunque, "contorto" ...

    Direi che devi basarti su dei semplici cicli, un po' come questo
    
    		XOR EAX, EAX
    		XOR ECX, ECX
    		XOR ESI, ESI
    
    		MOV transizioni01, EAX
    		MOV transizioni10, EAX
    
    		MOV CX, len
    
    		MOV SI, CX
    		SHR SI, 3  
    		DEC CX
    
    lpbit:
    		PUSH CX
    
    		MOV AL, vet[ESI]
    		BT AX,0 // Bit 0
    		JNC isb0z
    		BT AX,1 // Bit 1
    		JC done
    		INC transizioni10
    		JMP done
    isb0z:
    		BT AX,1 // Bit 1
    		JNC done
    		INC transizioni01
    
    done:
    		PUSH SI
    		INC SI
    
    		MOV CX, SI
    		XOR ESI, ESI
    
    			CLC		
    lpbyte:
    			RCR vet[ESI], 1
    			INC ESI
    			LOOP lpbyte
    
    			POP SI
    			POP CX
    
    		LOOP lpbit
    
  • Re: ASSEMBLY 8086

    Grazie della risposta
Devi accedere o registrarti per scrivere nel forum
6 risposte