【问题标题】:While search each character of a string and change it in emu8086 how to end infinite loop?在emu8086中搜索字符串的每个字符并更改它如何结束无限循环?
【发布时间】:2019-05-08 15:02:17
【问题描述】:

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

但是当我将 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' 没有改变。

【问题讨论】:

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


    【解决方案1】:

    不要使用LOOP

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

    'Bilgisayai'

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

    'bi ... lgisaya'

    scasb 找到第二个“i”时,CX4loop 指令将递减到 3,但继续正常。但是对于 scasb,您的字符串又短了 1 个字符!

    'bi ... lgi ...说'

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

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

    'bilgisayai??'

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

    'bi ... lgisayai?'

    scasb 找到第二个“i”时,CX6loop 指令将递减到 5,但继续正常。但是对于scasb,您的字符串又短了 1 个字符!

    'bi ... lgi ... sayai'

    scasb 找到第三个'i'时,CX0 并且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:
    

    【讨论】:

    • 成功了。谢谢你。实际上我找到了另一个解决方案。当我在值cx 的和处添加h 时,它也可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 2016-10-17
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多