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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top