x86 Frage zu Bitvergleiche
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.
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.