В примере, написанном на иврите, мой учитель написал, что последовательность появляется дважды.
Пример "010000101".
010000101
*** 1st
** * 2nd
Но это происходит только в том случае, если вы выполняете перенос на 8-битной границе.Как 16-битное число, оно 00000000 010000101
, и вы правильно обнаружите, что оно имеет только один 101
.
Я не понимаю, для каких случаев оно не работает.
Вы не обнулили счетчик на [bx]
заранее.Это, безусловно, тот случай, когда он не будет работать правильно.(Было бы проще вернуть значение счетчика в регистр, вместо того, чтобы вызывающий передавал указатель.)
А что с pop
?Если это процедура, первый pop
будет содержать обратный адрес.Обычный способ получить доступ к аргументам стека в 16-битном коде - создать указатель кадра с BP.
push bp
mov bp, sp
mov dx, [bp+4] ; The 16 bit number
mov bx, [bp+6] ; The results address
mov cx, 16
mov [bx], ch ; CH=0
Check:
mov ax, dx
and ax, 111b
cmp ax, 101b
sete al
add [bx], al
ror dx, 1
dec cx
jnz Check
pop bp
ret 4
Или, если вам нужна версия, совместимая с 8086 (счет ZF = 1, результат из cmp
без sete
), см. ответы на Как узнать, сколько раз 101b отображается в числе?
Ваш номер "1001011001010110":
1001011001010110
*** 1st
*** 2nd
*** 3rd
* ** 4th
Из обновленного кода в вопросе :
loop CheckThisFourNibble
Регистр CX
не инициализирован.Вы использовали DX
для итерации, поэтому пишите:
dec dx
jnz CheckThisFourNibble
msg1 db 'enter 4 characters'
Я удивлен, что msg1 не имеет какой-тотерминатора как 0 или "$".