Не использовать LOOP
Что происходит, когда вы устанавливаете CX=10
==> "Не найдено"
'bilgisayai'
Когда scasb
находит 1-е 'i', CX
равно 8 , а инструкция loop
уменьшается до 7 , но продолжается нормально.Однако для scasb
ваша строка теперь на 1 символ короче!
'bi ... lgisaya'
Когда scasb
находит второе 'i', CX
равно 4 и loop
инструкция будет уменьшена до 3 , но продолжит нормально.Однако для scasb
ваша строка снова на 1 символ короче!
'bi ... lgi ... say'
scasb
обработает еще 3 байта, больше не находит 'i' и программа завершает работу.
Что происходит, когда вы устанавливаете CX=12
==> «Бесконечный цикл»
'bilgisayai ??'
Когда scasb
находит1-й 'i', CX
равен 10 , а инструкция loop
будет уменьшена до 9 , но продолжит работать нормально.Однако для scasb
ваша строка теперь на 1 символ короче!
'bi ... lgisayai?'
Когда scasb
находит второе 'i', CX
равно 6 иloop
инструкция будет уменьшена до 5 , но будет продолжаться нормально.Однако для scasb
ваша строка снова на 1 символ короче!
'bi ... lgi ... sayai'
Когда scasb
находит третье 'i', CX
равно 0 и инструкция loop
будет уменьшена до 65535 и продолжится 'навсегда' .
Решение.
Заменить loop
наследующий код:
lea di, dizi1
mov cx, 10 ;Length of the string (true length!)
mov al, 'i'
mov bl, '#'
ara:
repne scasb
jnz cik
mov [di-1], bl
test cx, cx ;If CX=0 then SCASB was at end of string
jnz ara
cik: