比较字符串的一个字符并将其更改为另一个字符时,它不是更改最后一个字符。
但是当我将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'不变。
答案 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: