Frage

Im ein Problem mit einem letzten Teil meiner Aufgabe ist. Wir bekommen in einem Strom von Bits, etc etc, in dem Strom eine ganze Zahl mit der Anzahl von 1en in dem Textteil ist. Ich erhalte diese ganze Zahl ist und seine 24, die richtig ist, jetzt i Schleife durch die Textdaten i bekommen und ich versuche, all die, die 1 dort zu zählen. Aber meine proc ist immer Null zurück.

Ich war in der Lage, um sicherzustellen, es wurde Looping richtig und es ist.

Der Text = Hallo das ist 16 1, hier ist mein proc ist durch diesen Text zum Durchschleifen der Anzahl von Einsen in ihnen zu zählen.

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

der Rest der proc ist nur Push / Pops. Was im will dies tatsächlich tut, ist die Verwendung TEST vergleichen 100000000 auf ein Byte, wenn sie eine 1 inc AX sonst Verschiebung nach rechts die Maske durch 1 und Schleife eines ganzes Byte, als inc zum nächsten Byte und wieder tun.

War es hilfreich?

Lösung

'shr bh, 1' sollte wohl sein 'shr dh, 1', nicht wahr?

Andere Tipps

Nur um Ihnen eine alternative und kürzere Umsetzung Ihrer inneren Schleife:

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

Hier nicht testen wir die Bits überhaupt. Statt das Add AVW, dh das oberste Bit in das Carry verschiebt und tut auch das gleiche wie shl dh, 1 in einer Anweisung.

Die ADDC Axt, 0 fügt nur den Übertrag zu AX.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top