Pergunta

Im tendo um problema com uma parte final da minha atribuição. Nós entrar em um fluxo de bits, etc etc, na corrente é um inteiro com o número de 1s na parte de texto. Recebo esse inteiro e seu 24 o que é correto, agora circuito i através dos dados de texto que recebo e eu tento contar todos os 1 de lá. Mas meu proc sempre está retornando zero.

Eu era capaz de se certificar de que foi looping corretamente e é.

O texto = Olá que é 16 1 de, aqui é o meu proc para looping através desse texto para contar o número de uns nele.

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

o resto do proc é apenas empurrar / pops. Que im querendo isso para realmente fazer é usar o teste para comparar 100000000 para um byte, se for um 1 inc AX outra deslocamento para a direita da máscara por 1 e loop de um byte inteiro, do inc para o próximo byte e fazer novamente.

Foi útil?

Solução

'SHR bh, 1' provavelmente deve ser 'SHR dh, 1', não?

Outras dicas

Só para se ter uma implementação alternativa e mais curto do seu inner-loop:

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

Aqui nós não testar os bits em tudo. Ao invés, a dh add, mudanças dh a pouco mais alto para o transporte e também faz o mesmo que dh SHL, 1 em uma instrução.

O machado ADDC, 0 apenas adiciona o carry para AX.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top