pergunta x86 sobre comparações bit
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.
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.