

.method Miao(arg)

.var
count                              //contatore di ciclo
res                                //risultato parziale          
.end-var

       BIPUSH 32                   
       ISTORE count                //inizializza il count a 32
       BIPUSH 0                    
       ISTORE res                  //inizializza a 0 res
Loop:  ILOAD count                 
       IFEQ end                    //abbiamo scandito tutti i bit di arg?(count=0)se si vai a end 
       ILOAD arg                   
       IFLT incr                   //Il bit piu' a sinistra di arg e' 1?  Se si vai a incr 
       ILOAD arg                   //altrimenti shifta arg di un bit a sinistra 
       DUP                         //e decrementa count, poi torna a Loop
       IADD
       ISTORE arg
       IINC count -1
       GOTO Loop
incr:  ILOAD arg                   //shifta arg di un bit a sinistra, 
       DUP                         //incrementa res e decrementa count
       IADD
       ISTORE arg
       IINC res 1                 
       IINC count -1
       GOTO Loop
end:   ILOAD res
       IRETURN
.end-method

Altra possibile soluzione (by Giovanni Rizza)

.method conta(n)
  .var
    count     //contatore
    mask      //maschera per verifica presenza di 1 
  .endvar
  BIPUSH 0    //inizializza count
  ISTORE count 
  BIPUSH 1    //inizializza mask
  ISTORE mask 
  loop  ILOAD mask    //and bit-bit tra count e mask
        ILOAD n
        IAND 
        IFEQ et     //non c'e' l'1
        IINC count 1  //c'e' l'1 incremento il contatore
  et    ILOAD mask    //shift della maschera di 1 posiz a sx
        DUP
        IADD
        DUP         //controllo mask
        IFEQ end       //se 0 ho finito
        ISTORE mask   //aggiorno mask
        GOTO loop     //ciclo il confronto mask con n
  end   ILOAD count
        IRETURN
.endmethod

Ulteriore possibile soluzione (by Giovanni Rizza)

.method conta(n)
  .var
    count     //contatore
  .endvar
  BIPUSH 0    //inizializza count
  ISTORE count 
  mod LCD_W objref    //preparo l'invocazione per modulo
      ILOAD n         
      INVOKEVIRTUAL modulo     //invoco il metodo modulo
      IFEQ div              //se il resto e' 0 passo alla divisione
      IINC count 1          //altrimenti resto e' 1 incremento count
  div LCD_W objref    //preparo l'invocazione per dividi
      ILOAD n
      INVOKEVIRTUAL dividi    //invoco il metodo dividi
      DUP             //Duplico il risultato
      IFEQ end        //n=0 ho finito
      ISTORE n        //aggiorno n, cioe' n = n/2
      GOTO mod        //ritorno all'invocazione di modulo
  end ILOAD count
      IRETURN
.endmethod

.method modulo(n)
  .var
  .endvar
        ILOAD n     //uso il metodo delle sottr successive
        DUP         //controllo se n=1 resto = 1
        BIPUSH 1
        IF_ICMPEQ end   //n=1 -> resto 1
  loop  BIPUSH 2
        ISUB
        DUP         //controllo se n-2 = 0
        IFEQ end    //n-2 = 0 resto 0
        DUP         //controllo se n-2 = 1
        BIPUSH 1
        IF_ICMPEQ end    // n-2 = 1 resto 1
        GOTO loop   //sottraggo di nuovo in cima allo Stack ho il ris precedente
  end   IRETURN     //in ogni caso in cima allo Stack ho il resto (1 o 0)
.endmethod

.method dividi(n)
  .var
    q     //variabile per il quoziente
  .end
        ILOAD n     //uso il metodo delle sottr successive
  loop  BIPUSH 2
        ISUB
        DUP
        IFLT end  //se n-2<0 ho finito
        IINC q 1   //incremento il quoziente
        GOTO loop  //torno alla sottrazione, in cima allo stack ho n-2
  end   ILOAD q
        IRETURN
.endmethod



