在emu8086中搜索字符串的每个字符并更改它时如何结束无限循环?

While search each character of a string and change it in emu8086 how to end infinite loop?

将字符串中的一个字符与另一个字符进行比较和更改时,不会更改最后一个字符。

但是当我将 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

我想将字符串中的 'i's 更改为“#”,但最后一个 'i' 没有改变。

不要使用 LOOP

当您设置 CX=10 ==>“未找到”时会发生什么

'bilgisayai'

scasb找到第一个'i'时,CX8并且loop指令将递减到7,但继续正常。但是对于 scasb 你的字符串现在短了 1 个字符!

'bi ... lgisaya'

scasb找到第二个'i'时,CX4并且loop指令将递减到3,但继续正常。但是对于 scasb 你的字符串又短了 1 个字符!

'bi ... lgi ... say'

scasb 将处理另外 3 个字节,不再找到 'i' 并且程序退出。

设置 CX=12 ==>“无限循环”时会发生什么

'bilgisayai??'

scasb找到第一个'i'时,CX10并且loop指令将递减到9,但继续正常。但是对于 scasb 你的字符串现在短了 1 个字符!

'bi ... lgisayai?'

scasb找到第二个'i'时,CX6并且loop指令将递减到5,但继续正常。但是对于 scasb 你的字符串又短了 1 个字符!

'bi ... lgi ... sayai'

scasb找到第3个'i'时,CX0并且loop指令将递减到65535 ,然后继续 'forever'.

解决方案。

用下一个代码替换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: