Пока ищите каждый символ строки и меняйте его в emu8086, как закончить бесконечный цикл? - PullRequest
2 голосов
/ 08 мая 2019

Когда сравнивать и изменять символ строки на другой символ, он не меняет последний символ.

Но когда я изменяю cx на 12, это работает, но застрял в бесконечном цикле

.model small
.stack 64
.data
        dizi1 db 'bilgisayai'
.code
            mov ax,@data
            mov ds,ax
            mov es,ax

            lea di,dizi1

            mov cx,10
            mov al,'i'
            mov bl,'#'

ara: repne  scasb
            jnz cik
            mov [di-1],bl
            loop ara

cik:        mov ah,4ch
            int 21h
            end

Я хочу изменить «я в строке» на «#», но последнее «я» не изменится.

1 Ответ

2 голосов
/ 09 мая 2019

Не использовать 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:
...