在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'时,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
找到第一个'i'时,CX
是10并且loop
指令将递减到9,但继续正常。但是对于 scasb
你的字符串现在短了 1 个字符!
'bi ... lgisayai?'
当scasb
找到第二个'i'时,CX
是6并且loop
指令将递减到5,但继续正常。但是对于 scasb
你的字符串又短了 1 个字符!
'bi ... lgi ... sayai'
当scasb
找到第3个'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:
将字符串中的一个字符与另一个字符进行比较和更改时,不会更改最后一个字符。
但是当我将 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'时,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
找到第一个'i'时,CX
是10并且loop
指令将递减到9,但继续正常。但是对于 scasb
你的字符串现在短了 1 个字符!
'bi ... lgisayai?'
当scasb
找到第二个'i'时,CX
是6并且loop
指令将递减到5,但继续正常。但是对于 scasb
你的字符串又短了 1 个字符!
'bi ... lgi ... sayai'
当scasb
找到第3个'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: