2008-10-24 20 views
2

Im avoir un problème avec une partie finale de ma mission. Nous obtenons dans un flux de bits, etc etc, dans le flux est un nombre entier avec le nombre de 1 dans la partie de texte. Je reçois cet entier et son 24 qui est correct, maintenant je boucle à travers les données de texte que je reçois et j'essaye de compter tous les 1 là-dedans. Mais mon proc retourne toujours à zéro.x86 question sur les comparaisons de bits

J'étais capable de m'assurer qu'il bouclait correctement et il l'est.

Le texte = Bonjour qui est de 16 1, voici ma proc pour boucler ce texte pour compter le nombre de ceux qui s'y trouvent.

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 

Le reste de la proc est simplement push/pops. Ce que je veux faire est d'utiliser TEST pour comparer 100000000 à un octet, si c'est un AX inc 1 décalé à droite le masque de 1 et boucle tout un octet, puis inc sur l'octet suivant et recommence.

Répondre

2

'shr bh, 1' devrait probablement être 'shr dh, 1', non?

+0

wow im un idiot, c'est ça, merci. – chicken

1

Juste pour vous donner une solution de rechange et la mise en œuvre plus courte de votre boucle intérieure:

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

Ici, nous ne testons pas les bits du tout. Au lieu de cela, ajouter dh, dh déplace le bit le plus haut dans le carry et fait la même chose que shl dh, 1 en une instruction.

La commande addc ax, 0 ajoute simplement le report à AX.

+0

thx pour le conseil. – chicken