Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
21/06/11 14:22
matteomircoli
Ciao ragazzi devo risolvere un problema in ijvm si tratta di contare in una word a 32 bit se il numero di bit settati a 1 è pari o dispari e bisogna restituire il risultato al tos
io ho fatto nel seguente modo:

.constant
valx 0x79
objref 0x0
.end-constant

.main   
.var
z
.end-var
   LDC_W objref
   LDC_W valx
   
   INVOKEVIRTUAL contabit 
  // DUP
     OUT
     HALT
.end-main







.method contabit(p)
          .var
          a
           x                         //Maschera
          count                     //Contatore
          .end-var
          BIPUSH 1
          ISTORE a
          BIPUSH 1            //Inizializzo la maschera a 0000...0001 (32bit)
          ISTORE x
          BIPUSH 0            //Inizializzo il contatore a 0
          ISTORE count
     e1:  ILOAD x             //Se la maschera è 0 significa che ho 
                              //controllato tutti e 32bit
                              //(è a 0 perchè è andata in overflow)
          IFEQ fine           //Quindi salto a fine
          ILOAD x             //Carico la maschera
          ILOAD p             //Carico il numero
          IAND                //Ne faccio l'and logico
          IFEQ e2             //Se è 0 significa che il bit che sto 
                              //controllando è 0
          IINC count 1        //Se invece non è 0, significa che è presente
                              //un 1 e quindi incremento il contatore
     e2:  ILOAD x             //Faccio uno shift a sinistra di 1 bit della
                              //maschera
          DUP
          IADD
          ISTORE x
          GOTO e1             //Ripeto il controllo
   fine:  ILOAD count         //Metto sullo stack il contatore
          BIPUSH 1
          IAND
          IFEQ pari
       //   BIPUSH 0x1           // torna 1 se è dispari
          BIPUSH 1
          ILOAD a
          IRETURN
   pari:  BIPUSH 0x0           //torna zero se è pari
       
         IRETURN
.end-method


il mio unico problema è che il risultato non sta nel tos

grazie in anticipo
matteo

risolto
Ultima modifica effettuata da matteomircoli 14/07/11 19:04
aaa
24/07/11 7:53
matteomircoli
Postato originariamente da matteomircoli:

Ciao ragazzi devo risolvere un problema in ijvm si tratta di contare in una word a 32 bit se il numero di bit settati a 1 è pari o dispari e bisogna restituire il risultato al tos
io ho fatto nel seguente modo:

.constant
valx 0x79
objref 0x0
.end-constant

.main   
.var
z
.end-var
   LDC_W objref
   LDC_W valx
   
   INVOKEVIRTUAL contabit 
  // DUP
     OUT
     HALT
.end-main







.method contabit(p)
          .var
          a
           x                         //Maschera
          count                     //Contatore
          .end-var
          BIPUSH 1
          ISTORE a
          BIPUSH 1            //Inizializzo la maschera a 0000...0001 (32bit)
          ISTORE x
          BIPUSH 0            //Inizializzo il contatore a 0
          ISTORE count
     e1:  ILOAD x             //Se la maschera è 0 significa che ho 
                              //controllato tutti e 32bit
                              //(è a 0 perchè è andata in overflow)
          IFEQ fine           //Quindi salto a fine
          ILOAD x             //Carico la maschera
          ILOAD p             //Carico il numero
          IAND                //Ne faccio l'and logico
          IFEQ e2             //Se è 0 significa che il bit che sto 
                              //controllando è 0
          IINC count 1        //Se invece non è 0, significa che è presente
                              //un 1 e quindi incremento il contatore
     e2:  ILOAD x             //Faccio uno shift a sinistra di 1 bit della
                              //maschera
          DUP
          IADD
          ISTORE x
          GOTO e1             //Ripeto il controllo
   fine:  ILOAD count         //Metto sullo stack il contatore
          BIPUSH 1
          IAND
          IFEQ pari
       //   BIPUSH 0x1           // torna 1 se è dispari
          BIPUSH 1
          ILOAD a
          IRETURN
   pari:  BIPUSH 0x0           //torna zero se è pari
       
         IRETURN
.end-method


il mio unico problema è che il risultato non sta nel tos

grazie in anticipo
matteo

risolto




ecco il sorgente funzionante


.constant
valx 0x79
objref 0x0
.end-constant

.main   
.var
z
.end-var
  LDC_W objref
   LDC_W valx
   
   INVOKEVIRTUAL contabit 
      HALT
.end-main

.method contabit(p)
          .var
          a
           x                         //Maschera
          count                     //Contatore
          .end-var
          BIPUSH 1
          ISTORE a
          BIPUSH 1            //Inizializzo una  maschera di controllo a 00000000000000000000000000000001 (32bit)
          ISTORE x
          BIPUSH 0            
          ISTORE count        //Inizializzo il contatore a 0
     e1:  ILOAD x             //Se la maschera è 0 significa che ho 
                              //controllato tutti e 32bit
          IFEQ fine           //Quindi salto a fine
          ILOAD x             //Carico la maschera
          ILOAD p             //Carico il numero
          IAND                //Ne faccio l'and logico
          IFEQ e2             //Se è 0 significa che il bit che sto 
                              //controllando è 0
          IINC count 1        //Se invece non è 0, significa che è settato a 1 e quindi  
                              // e quindi incremento il contatore count
     e2:  ILOAD x             //shift a sinistra di 1 bit della
                              //maschera
          DUP
          IADD
          ISTORE x
          GOTO e1             //Ripeto il controllo
   fine:  ILOAD count         //Metto sullo stack il contatore
          BIPUSH 1
          IAND
          IFEQ pari
          ILOAD a         // torna 1 se è dispari
          BIPUSH 1
          ISTORE a
          iload a
          IRETURN
   pari:  iload a
          BIPUSH 0           //torna zero se è pari
          istore a
          iload a 
          IRETURN
.end-method





prego un moderatore di chiudere visto che il problema è stato risolto
aaa