对于问题7.7程序,改成以下程序为什么还正常运行结果
assume cs:codea 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
这样居然正常运行,还正确的结果,为什么,请问哪位大神解答! 只要在 循环s 执行前将si赋值为0就没问题,
首次执行循环s,虽然前面没有mov si, 0, 仍可正常运行
是因为 si的初始默认值就是0, 所以不影响 不是si赋值问题,我都知道SI初始值是0,我才调到最后才赋值,现在CX为什么从ffff,跳到0003没有死循环?
对,这个程序应该是个死循环,但是没有死循环,很奇怪,于是我t单步执行了过去,发现了一个有趣的事情,就是在,bx=60(早就越界了),修改了code段的代码,在and al,11011111b和mov ,al位置,代码变了,于是循环被打乱,就结束了。有了猜想之后,我运行结束之后,再次查看了代码段的指令,发现果真如此,因为我发不了图片,所以我只讲这些了,你自己运行完了之后查看一下代码段的指令就好了。总结,因为ds的越界,导致我们无意中修改了代码段的代码,导致死循环被打破,程序碰巧正常结束.(附加一个提醒,因为每个汇编语句在机器码的长度不一样,所以只要前面某一个汇编语句被改,可能后面全错,但是在这,正好结束语句被理解正确,运气真好)
页:
[1]