Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - ijvm problema con il tos risolto
Forum - Java - ijvm problema con il tos risolto

Avatar
matteomircoli (Normal User)
Newbie


Messaggi: 2
Iscritto: 21/06/2011

Segnala al moderatore
Postato alle 16:22
Martedì, 21/06/2011
Questo topic è stato chiuso dal moderatore

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:

Codice sorgente - presumibilmente Java

  1. .constant
  2. valx 0x79
  3. objref 0x0
  4. .end-constant
  5.  
  6. .main  
  7. .var
  8. z
  9. .end-var
  10.    LDC_W objref
  11.    LDC_W valx
  12.    
  13.    INVOKEVIRTUAL contabit
  14.   // DUP
  15.      OUT
  16.      HALT
  17. .end-main
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. .method contabit(p)
  26.           .var
  27.           a
  28.            x                         //Maschera
  29.           count                     //Contatore
  30.           .end-var
  31.           BIPUSH 1
  32.           ISTORE a
  33.           BIPUSH 1            //Inizializzo la maschera a 0000...0001 (32bit)
  34.           ISTORE x
  35.           BIPUSH 0            //Inizializzo il contatore a 0
  36.           ISTORE count
  37.      e1:  ILOAD x             //Se la maschera è 0 significa che ho
  38.                               //controllato tutti e 32bit
  39.                               //(è a 0 perchè è andata in overflow)
  40.           IFEQ fine           //Quindi salto a fine
  41.           ILOAD x             //Carico la maschera
  42.           ILOAD p             //Carico il numero
  43.           IAND                //Ne faccio l'and logico
  44.           IFEQ e2             //Se è 0 significa che il bit che sto
  45.                               //controllando è 0
  46.           IINC count 1        //Se invece non è 0, significa che è presente
  47.                               //un 1 e quindi incremento il contatore
  48.      e2:  ILOAD x             //Faccio uno shift a sinistra di 1 bit della
  49.                               //maschera
  50.           DUP
  51.           IADD
  52.           ISTORE x
  53.           GOTO e1             //Ripeto il controllo
  54.    fine:  ILOAD count         //Metto sullo stack il contatore
  55.           BIPUSH 1
  56.           IAND
  57.           IFEQ pari
  58.        //   BIPUSH 0x1           // torna 1 se è dispari
  59.           BIPUSH 1
  60.           ILOAD a
  61.           IRETURN
  62.    pari:  BIPUSH 0x0           //torna zero se è pari
  63.        
  64.          IRETURN
  65. .end-method



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

grazie in anticipo
matteo

risolto

Ultima modifica effettuata da matteomircoli il 14/07/2011 alle 21:04
PM
Avatar
matteomircoli (Normal User)
Newbie


Messaggi: 2
Iscritto: 21/06/2011

Segnala al moderatore
Postato alle 9:53
Domenica, 24/07/2011
Testo quotato

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:

Codice sorgente - presumibilmente Java

  1. .constant
  2. valx 0x79
  3. objref 0x0
  4. .end-constant
  5.  
  6. .main  
  7. .var
  8. z
  9. .end-var
  10.    LDC_W objref
  11.    LDC_W valx
  12.    
  13.    INVOKEVIRTUAL contabit
  14.   // DUP
  15.      OUT
  16.      HALT
  17. .end-main
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. .method contabit(p)
  26.           .var
  27.           a
  28.            x                         //Maschera
  29.           count                     //Contatore
  30.           .end-var
  31.           BIPUSH 1
  32.           ISTORE a
  33.           BIPUSH 1            //Inizializzo la maschera a 0000...0001 (32bit)
  34.           ISTORE x
  35.           BIPUSH 0            //Inizializzo il contatore a 0
  36.           ISTORE count
  37.      e1:  ILOAD x             //Se la maschera è 0 significa che ho
  38.                               //controllato tutti e 32bit
  39.                               //(è a 0 perchè è andata in overflow)
  40.           IFEQ fine           //Quindi salto a fine
  41.           ILOAD x             //Carico la maschera
  42.           ILOAD p             //Carico il numero
  43.           IAND                //Ne faccio l'and logico
  44.           IFEQ e2             //Se è 0 significa che il bit che sto
  45.                               //controllando è 0
  46.           IINC count 1        //Se invece non è 0, significa che è presente
  47.                               //un 1 e quindi incremento il contatore
  48.      e2:  ILOAD x             //Faccio uno shift a sinistra di 1 bit della
  49.                               //maschera
  50.           DUP
  51.           IADD
  52.           ISTORE x
  53.           GOTO e1             //Ripeto il controllo
  54.    fine:  ILOAD count         //Metto sullo stack il contatore
  55.           BIPUSH 1
  56.           IAND
  57.           IFEQ pari
  58.        //   BIPUSH 0x1           // torna 1 se è dispari
  59.           BIPUSH 1
  60.           ILOAD a
  61.           IRETURN
  62.    pari:  BIPUSH 0x0           //torna zero se è pari
  63.        
  64.          IRETURN
  65. .end-method



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

grazie in anticipo
matteo

risolto





ecco il sorgente funzionante


Codice sorgente - presumibilmente Plain Text

  1. .constant
  2. valx 0x79
  3. objref 0x0
  4. .end-constant
  5.  
  6. .main  
  7. .var
  8. z
  9. .end-var
  10.   LDC_W objref
  11.    LDC_W valx
  12.    
  13.    INVOKEVIRTUAL contabit
  14.       HALT
  15. .end-main
  16.  
  17. .method contabit(p)
  18.           .var
  19.           a
  20.            x                         //Maschera
  21.           count                     //Contatore
  22.           .end-var
  23.           BIPUSH 1
  24.           ISTORE a
  25.           BIPUSH 1            //Inizializzo una  maschera di controllo a 00000000000000000000000000000001 (32bit)
  26.           ISTORE x
  27.           BIPUSH 0            
  28.           ISTORE count        //Inizializzo il contatore a 0
  29.      e1:  ILOAD x             //Se la maschera è 0 significa che ho
  30.                               //controllato tutti e 32bit
  31.           IFEQ fine           //Quindi salto a fine
  32.           ILOAD x             //Carico la maschera
  33.           ILOAD p             //Carico il numero
  34.           IAND                //Ne faccio l'and logico
  35.           IFEQ e2             //Se è 0 significa che il bit che sto
  36.                               //controllando è 0
  37.           IINC count 1        //Se invece non è 0, significa che è settato a 1 e quindi  
  38.                               // e quindi incremento il contatore count
  39.      e2:  ILOAD x             //shift a sinistra di 1 bit della
  40.                               //maschera
  41.           DUP
  42.           IADD
  43.           ISTORE x
  44.           GOTO e1             //Ripeto il controllo
  45.    fine:  ILOAD count         //Metto sullo stack il contatore
  46.           BIPUSH 1
  47.           IAND
  48.           IFEQ pari
  49.           ILOAD a         // torna 1 se è dispari
  50.           BIPUSH 1
  51.           ISTORE a
  52.           iload a
  53.           IRETURN
  54.    pari:  iload a
  55.           BIPUSH 0           //torna zero se è pari
  56.           istore a
  57.           iload a
  58.           IRETURN
  59. .end-method




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

PM