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

时间:2019-05-08 15:02:17

标签: assembly infinite-loop x86-16 instructions emu8086

比较字符串的一个字符并将其更改为另一个字符时,它不是更改最后一个字符。

但是当我将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'更改为'#',但最后一个'i'不变。

1 个答案:

答案 0 :(得分:2)

请勿使用LOOP

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

  

'bilgisayai'

scasb找到第一个'i'时,CX 8 ,并且loop指令将减小为 7 ,但仍然可以。但是,对于scasb,您的字符串现在要短1个字符!

  

'bi ... lgisaya'

scasb找到第二个'i'时,CX 4 ,并且loop指令将减小为 3 ,但仍然可以。但是对于scasb,您的字符串又要短1个字符!

  

'bi ... lgi ...说'

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

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

  

'bilgisayai ??'

scasb找到第一个'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 ,并继续'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: