鱼C论坛

 找回密码
 立即注册
查看: 4348|回复: 3

[争议讨论] 对于问题7.7程序,改成以下程序为什么还正常运行结果

[复制链接]
发表于 2021-2-12 22:52:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code
a segment
        db 'ibm.............'
        db 'dec.............'
        db 'dos.............'
        db 'vax.............'
        a ends
code segment
        start:mov ax,a
              mov ds,ax
              mov bx,0
              mov cx,4      
           s0:               ;这里没有给SI赋值就可以正常运行
               mov cx,3  
            s:mov al,[bx+si]
              and al,11011111b
              mov [bx+si],al
              inc si        
          loop s
          add bx,16
          mov si,0        ;这里才给SI初始化0
          loop s0
          mov ax,4c00h
          int 21h
          code ends
          end start
这样居然正常运行,还正确的结果,为什么,请问哪位大神解答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-13 00:09:19 | 显示全部楼层
只要在 循环s 执行前将si赋值为0就没问题,
首次执行循环s,虽然前面没有mov si, 0, 仍可正常运行
是因为 si的初始默认值就是0, 所以不影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-13 14:33:44 | 显示全部楼层
不是si赋值问题,我都知道SI初始值是0,我才调到最后才赋值,现在CX为什么从ffff,跳到0003没有死循环?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-13 18:29:49 | 显示全部楼层
对,这个程序应该是个死循环,但是没有死循环,很奇怪,于是我t单步执行了过去,发现了一个有趣的事情,就是在,bx=60(早就越界了),修改了code段的代码,在and al,11011111b和mov [bx+si],al位置,代码变了,于是循环被打乱,就结束了。有了猜想之后,我运行结束之后,再次查看了代码段的指令,发现果真如此,因为我发不了图片,所以我只讲这些了,你自己运行完了之后查看一下代码段的指令就好了。总结,因为ds的越界,导致我们无意中修改了代码段的代码,导致死循环被打破,程序碰巧正常结束.(附加一个提醒,因为每个汇编语句在机器码的长度不一样,所以只要前面某一个汇编语句被改,可能后面全错,但是在这,正好结束语句被理解正确,运气真好)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 09:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表