285583335 发表于 2021-2-12 22:52:48

对于问题7.7程序,改成以下程序为什么还正常运行结果

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,
              and al,11011111b
              mov ,al
              inc si        
          loop s
          add bx,16
          mov si,0      ;这里才给SI初始化0
          loop s0
          mov ax,4c00h
          int 21h
          code ends
          end start
这样居然正常运行,还正确的结果,为什么,请问哪位大神解答!

wtchou 发表于 2021-2-13 00:09:19

只要在 循环s 执行前将si赋值为0就没问题,
首次执行循环s,虽然前面没有mov si, 0, 仍可正常运行
是因为 si的初始默认值就是0, 所以不影响

285583335 发表于 2021-2-13 14:33:44

不是si赋值问题,我都知道SI初始值是0,我才调到最后才赋值,现在CX为什么从ffff,跳到0003没有死循环?

635924705 发表于 2021-2-13 18:29:49

对,这个程序应该是个死循环,但是没有死循环,很奇怪,于是我t单步执行了过去,发现了一个有趣的事情,就是在,bx=60(早就越界了),修改了code段的代码,在and al,11011111b和mov ,al位置,代码变了,于是循环被打乱,就结束了。有了猜想之后,我运行结束之后,再次查看了代码段的指令,发现果真如此,因为我发不了图片,所以我只讲这些了,你自己运行完了之后查看一下代码段的指令就好了。总结,因为ds的越界,导致我们无意中修改了代码段的代码,导致死循环被打破,程序碰巧正常结束.(附加一个提醒,因为每个汇编语句在机器码的长度不一样,所以只要前面某一个汇编语句被改,可能后面全错,但是在这,正好结束语句被理解正确,运气真好)
页: [1]
查看完整版本: 对于问题7.7程序,改成以下程序为什么还正常运行结果