Question

J'ai un problème avec une dernière partie de mon travail. Nous entrons dans un flux de bits, etc., etc., dans le flux est un entier avec le nombre de 1 dans la portion de texte. Je reçois cet entier et ses 24 qui sont corrects, maintenant je boucle à travers les données textuelles que je reçois et j'essaie de compter tous les 1 dedans. Mais mon proc retourne toujours zéro.

J'ai pu m'assurer qu'il bouclait correctement et c'est le cas.

Le texte = Bonjour qui est 16 1, voici mon proc pour faire une boucle dans ce texte pour compter le nombre de uns en elle.

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 juste push / pops. Ce que je veux vraiment faire, c’est utiliser TEST pour comparer 100000000 à un octet, si c’est un AX inchangé, sinon déplacer le masque de 1 à droite et boucler un octet entier, puis augmenter en octet suivant et recommencer.

Était-ce utile?

La solution

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

Autres conseils

Juste pour vous donner une implémentation alternative et plus courte de votre boucle interne:

        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, ajoutez dh, dh déplace le bit le plus haut dans le report et fait la même chose que shl dh, 1 dans une instruction.

L'addc ax, 0 ajoute simplement le report à AX.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top