这个问题发现于6.2章节,程序6.3。
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,32
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
问题一:将此程序编译连接后,用debug跟踪 ,执行mov ax,cs 后用-d (cs):0看内存中的数据是:
23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
这里是正常的,然后执行 mov ss,ax,再用-d (cs):0看内存中的数据就会变为:
23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
00 00 00 00 00 00 55 0B-00 00 27 00 55 0B 5F 05
请问55 0B-00 00 27 00 55 0B 5F 05是哪里来的??
问题二:这个问题就相当神奇了,将此程序编译连接,用debug跟踪后用-t单步执行直至指令 mov ax,4c00h 为止,此时用-d (cs):0查看内存的结果是:
55 0B 00 00 ED 0F EF 0D-BC 0A 89 07 56 04 23 01
55 0B 55 0B 55 0B 55 0B-00 00 43 00 55 0B 5F 05
发现了吧,此时的结果和书上想要达成的结果是不一样的。
然后-q退出,再次跟踪,用-g 43直接执行到指令mov ax,4c00h 后用-d (cs):0查看内存的结果是:
87 09 BA 0C ED 0F EF 0D-BC 0A 89 07 56 04 23 01
87 09 BA 0C ED 0F EF 0D-00 00 43 00 55 0B 5F 05
这才是书上想要的结果。
问题就出来了,为什么单步执行和直接执行所达到的结果是不一样的呢??为什么会出现这种情况??
先给出我的操作环境,windows XP,运行---cmd下的伪DOS。
求解释。 |