PDA

View Full Version : [assembly] esercizio vettori


tonno16
06-05-2013, 12:51
salve a tutti. Ho un esercizietto da sottomettervi. Dato un vettore di interi devo creare un vettore compresso di char dove compaia il numero di volte che il numero compare, e il numero stesso. ESEMPIO:

vettore: 1 1 1 1 1 3 4 4 5

compresso: 5 1 1 3 2 4 1 5

5 volte l'uno 1 volta il 2.......

il mio codice funziona tranno che nel caso in qui ci siano cifre ripetute più di 255 volte, e dato che char non può essere > il caso fallisce

ecco il codice:
#include <stdio.h>
#include <stdlib.h>


void main(){

#define MaxLen 1024
int Len = 30;
unsigned char Buffer[MaxLen] = {97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,255}
;
#define MaxLenComp (MaxLen*2+1)
unsigned char BufComp[MaxLenComp];

__asm{
XOR EAX,EAX
XOR EDX,EDX
XOR ESI,ESI
XOR EBX,EBX

MOV EAX,0 // i = 0
MOV EDX,1 // j = 1
MOV ESI,0 // indice vettore compresso
MOV EBX,1 // conta = 1

inizio: CMP EAX,30
JE fine // salta a fine se j > 30
XOR ECX,ECX
MOV CL,Buffer[EDX]
CMP Buffer[EAX],CL
JE incrementa // vai a incrementa se i numeri coincidono
//altrimenti3
spezza: MOV BufComp[ESI],BL // compresso[indice] = conta
INC ESI
XOR ECX,ECX
MOV CL,Buffer[EAX]
MOV BufComp[ESI],CL // compresso[indice] = vettore[i]
INC EAX // i++
INC EDX // j++
INC ESI
MOV EBX,1
JMP inizio

incrementa: INC EBX
CMP EBX,255
JE spezza // vai a spezza se il contatore = 255
// altrimenti
INC EAX
INC EDX
JMP inizio

fine: MOV BufComp[ESI],0
}

int i;
for(i=0;i<Len;i++){ printf("%d ", Buffer[i]); }
printf("\n\n");

for(i=0;BufComp[i];){
printf("%d ", BufComp[i++]);
printf("%d ", BufComp[i++]);
}


system("pause");
}

avete idee?? ho anche un foglio con l'algoritmo scritto, ma non capisco dove sbaglio