x86 pregunta sobre comparaciones de bits
Pregunta
Tengo un problema con una parte final de mi tarea. Nos metemos en una secuencia de bits, etc, en la secuencia es un número entero con el número de 1 en la parte del texto. Obtengo ese número entero y su 24, que es correcto, ahora hago un bucle a través de los datos de texto que recibo y trato de contar todos los 1 allí. Pero mi proc siempre está devolviendo cero.
Fui capaz de asegurarme de que estaba en bucle correctamente y lo es.
El texto = Hola que es 16 1, aquí está mi proc para recorrer en bucle ese texto para contar el número de unos.
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
el resto del proceso es solo push / pops. Lo que realmente quiero que haga esto es utilizar TEST para comparar 100000000 con un byte, si es un AX de 1 inc., También puede cambiar la máscara a la derecha en 1 y hacer un bucle de un byte completo, en lugar de inc al byte siguiente y volver a hacerlo.
Solución
'shr bh, 1' probablemente debería ser 'shr dh, 1', ¿no?
Otros consejos
Solo para ofrecerle una implementación alternativa y más corta de su bucle interno:
mov cx, 8
mov dh, byte ptr [bx+si]
@@innerLoop:
add dh, dh
adc ax, 0
loop @@innerLoop
Aquí no probamos los bits en absoluto. En su lugar, el comando add dh, dh desplaza el bit superior al carry y también hace lo mismo que shl dh, 1 en una instrucción.
El eje addc, 0 simplemente agrega el acarreo a AX.