2)
1825:0100 mov ax,2000
1825:0103 mov ds,ax
1825:0105 mov ax,1000
1825:0108 mov sp,0010
1825:010B mov ss,ax
1825:010D pop [e]
1825:0111 pop [c]
1825:0115 pop [a]
1825:0119 pop [8]
1825:011D pop [6]
1825:0121 pop [4]
1825:0125 pop [2]
1825:0129 pop [0]
1825:012D
-r
AX=0000 SP=FFEE DS=1825 SS=1825 CS=1825 IP=0100
1825:0100 B80020 MOV AX,2000
-t
AX=2000 SP=FFEE DS=1825 SS=1825 CS=1825 IP=0103
1825:0103 8ED8 MOV DS,AX
-t
AX=2000 SP=FFEE DS=2000 SS=1825 CS=1825 IP=0105
1825:0105 B80010 MOV AX,1000
-t
AX=1000 SP=FFEE DS=2000 SS=1825 CS=1825 IP=0108
1825:0108 BC1000 MOV SP,0010
-t
AX=1000 SP=0010 DS=2000 SS=1825 CS=1825 IP=010B
1825:010B 8ED0 MOV SS,AX
-t
AX=1000 SP=0012 DS=2000 SS=1000 CS=1825 IP=0111
1825:0111 8F060C00 POP [000C] DS:000C=0000
想到了(1)中的情况,于是故意把指令顺序改了改顺序,把mov ss,ax放到mov sp的后面,结果执行之后居然又直接跳过了!直接到了pop [c]!!难道对ss的操作都会导致其后的那条指令被吞掉吗?那么被吞掉的那条指令是真跳过了?还是在暗中被执行了呢?
带着疑问,自己实验了一下:
首先查看数据段中的原始内容,如下:
-d 2000:0 10
2000:0000 11 22 33 44 55 66 77 88-99 11 22 33 44 55 66 88
2000:0010 00
然后把cs:ip指向mov ss,ax:
-r
AX=1000 SP=0012 DS=2000 SS=1000 CS=1825 IP=010B
1825:010B 8ED0 MOV SS,AX
再查看目标堆栈段1000:0的内容:都是零,看做是空的
-d 1000:0 10
1000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1000:0010 00
执行上述指令:
-t
SP=0014 BP=0000 SI=0000 DI=0000
DS=2000 SS=1000 CS=1825 IP=0111
1825:0111 8F060C00 POP [000C] DS:000C=5544
如果那条pop [e]被暗中执行了的话,那么2000:000e和000f中的内容都应该会变成00 00,再次查看验证上述猜想:
-d 2000:0 10
2000:0000 11 22 33 44 55 66 77 88-99 11 22 33 44 55 00 00
2000:0010 00
果然!看来那条指令确实是被暗中执行了
不知道自己这样的实验是否科学,所得结论对其他情况有没有一般性,请达人指点!! . |