assembly e i vettori di chart

« Older   Newer »
  Share  
01010101
view post Posted on 6/5/2013, 13:00




salve a tutti. Vedo che forse l'argomenti assembly non suscita molto interesse, ma non importa spero che qualcuno primo poi legga, o legga e melgio risponda.

devo scorrere un vettore di numero interi e rimpire un nuovo vettore nel seguente modo:

int vettore= 1,1,1,1,4,4,5,6
compresso= 4,1,2,4,1,5........4 volte il numero 1, una volta il numero 2 etc etc

il programma funziona in tutti i casi tranne quando il vettore contiene un numero ripetuto più di 255. La consegna prevede che essendo un vettore di char una volta arrivato a 255 il contatore dei numeri uguali....anche se il 256esimo è uguale al 255esimo il programma deve scrivere 255, x (255 volte il numero x) e poi azzerare il contatore e scrivere 4,x (in pratica 255 x 4 x) invece che 259 x.

vi lascio il codice:
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");
}


idee su come risolvere?
 
Top
0 replies since 6/5/2013, 13:00   39 views
  Share