question x86 sur les comparaisons de bits
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.
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.