Domanda

Sto avendo un problema con una parte finale del mio incarico. Otteniamo un flusso di bit, ecc. Ecc., Nel flusso è un numero intero con il numero di 1 nella porzione di testo. Ottengo quell'intero e il suo 24 che sono corretti, ora cerco i dati di testo che ottengo e provo a contare tutti gli 1 presenti. Ma il mio proc restituisce sempre zero.

Sono stato in grado di assicurarmi che il looping fosse corretto e lo è.

Il testo = Ciao che è 16 1, ecco il mio proc per scorrere in ciclo quel testo per contare il numero di quelli in esso.

sub     AX,AX
sub     SI,SI
mov     bx,[bp+6]       ;get message offset    

@@mainLoop:
    mov     cx,8
    mov     dh,80h
    cmp     byte ptr [bx + si],0
    je      @@endChecker
@@innerLoop:
    test    byte ptr [bx + si],dh
    jz      @@zeroFound
    inc     AX
    @@zeroFound:
        shr     bh,1
        loop    @@innerLoop     
    @@continue:
        inc     si
        jmp     @@mainLoop

il resto del proc è solo push / pops. Quello che voglio davvero fare è usare TEST per confrontare 100000000 con un byte, se è un 1 inc AX altrimenti sposta a destra la maschera di 1 e passa in ciclo un intero byte, quindi inc al byte successivo e fare di nuovo.

È stato utile?

Soluzione

'shr bh, 1' dovrebbe probabilmente essere 'shr dh, 1', no?

Altri suggerimenti

Solo per darti un'implementazione alternativa e più breve del tuo ciclo interno:

        mov    cx, 8
        mov    dh, byte ptr [bx+si] 
@@innerLoop:
        add    dh, dh    
        adc    ax, 0
        loop   @@innerLoop    

Qui non testiamo affatto i bit. Invece l'aggiunta dh, dh sposta il bit più in alto nel carry e fa lo stesso di shl dh, 1 in un'istruzione.

L'asse addc, 0 aggiunge semplicemente il carry ad AX.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top