Я не уверен, что понял, где находится 4-я копия.Я (и @sivizius) думал, что он состоит из битов 7, 0 и 1 (переход к верхнему биту).Но, видимо, это не то, что вам нужно.
(Также ваша нумерация битов не имеет смысла. Вы говорите, что старший бит вашего 8-битного числа - это бит 0, но в комментариях вы настаиваете, что хотите работать с 16-битовые числа. Итак, что такое битовое число 1<<15
?)
В любом случае, я думаю, вы хотите найти такие шаблоны, как 1.0.1
и 1..0..1
?(Где .
- это необязательный заполнитель в шаблоне, который может соответствовать 0 или 1).
Вы можете искать тех с чем-то вроде этого (внутри цикла shr dx, 1
).
; dumb brute force method.
countloop: ; do {
mov ax, dx
and al, 111b ; select the bits that matter in 101
cmp al, 101b ; check that it's the pattern we want
; do count += ZF somehow
mov ax, dx
and al, 10101b ; select the bits that matter in 1.0.1
cmp al, 10001b ; check that it's the pattern we want
; do count += ZF somehow
mov ax, dx
and al, 1001001b ; select the bits that matter in 1..0..1
cmp al, 1000001b ; check that it's the pattern we want
; do count += ZF somehow
... for all the rest of the patterns.
; Wider patterns will need to use AX instead of AL
shr dx, 1
cmp dx, 101b
jae countloop ; }while(x >= 0b101);
;;; exit the loop as soon as DX contains no bits high enough to possibly match
;;; with a big loop, this is worth the extra cmp
;;; instead of just using jnz on the shr dx,1 result
Точно так же, как вы делаете для 101b
, за исключением того, что вы устанавливаете биты безразличия в ноль.
Я не думалничего лучше, чем проверка отдельно для каждого возможного шаблона отдельно внутри тела цикла.
"count + = ZF" может быть (386) setz al
/ add cl, al
илипростой jnz
более inc cx
.(Я думаю, что максимально возможное число меньше 255, так что 8-битный счетчик подойдет.)
Обратите внимание, что я не использую cx
в качестве счетчика цикла, вместо этого завершаю цикл после сдвига всехбиты из dx
Другой способ сделать это без ответвлений без SETCC будет
mov ax, dx
and al, 10101b
xor al, 10001b
sub al, 1 ; set CF only if AL==0
adc cx, 0 ; cx += (al == 0b10001)