debug下的诡异情况, 有图
本帖最后由 五号智能 于 2014-1-24 01:56 编辑在做王爽汇编时出现的诡异情况,不知道是什么原因原代码如下:
assume cs:codeassume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987
dw 0,0,0,0,0,0,0,0
stf: mov ax,cs
mov ss,ax
mov sp,32h
mov bx,0
mov cx,8
s: push cs:
add bx,2h
loop s
mov cx,8
mov bx,0
t: pop cs:
add bx,2
loop t
int 21h
code ends
end stf
编译后,在debug下出现了如此情况
请看图1.2.3的变化
在最后一张里,刚执行了两个t,指令就跳到第四行了,第三行mov sp,0032被跳过了,而且BX指令后面的值很诡异,不是上面代码写的0,运行之后,BX被赋值为076a了;现在是大半夜了,出现这诡异的情况让我毛骨悚然呐.见鬼了
我用系统自带debug 测试OK啊 怀疑是dosbox出问题或者楼主使用时操作有误 那啥 我是直接把 mov ax,cs.....用a打到debug的 可能是我搞错了2 表见怪啊 :mad:还没学到这里。呵呵 本帖最后由 tk2003 于 2014-1-24 17:02 编辑
1.在最后一张里,刚执行了两个t,指令就跳到第四行了,第三行mov sp,0032被跳过了
请看王爽书本第73页,写的很清楚,这条指令紧跟上一个指令执行了!
赋值问题倒是没搞清楚,运行看看去
第2:BX的值出现问题,个人分析是这样的:
你的cs段是哪里开始的呢?其实不是stf:标号表明的,而是你的dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987,因为它紧跟在code段下,所以它应该先执行,你用D命令查看,076a:0 从0开始就是你定义的数值,PS:DW段最后一个你没用16进制,所以DEBUG看到的是转换后的16进制,
程序走走走,走到第一条,而这一条其实不是cs段的开头076a:0,而是076a:0020,因为前面2段给你定义了数值,mov ax,cs 执行了,ax=076a,第二条,mov ss,ax,也执行了,ss=076a,这2条没问题,但是下一条mov bx,0无法执行,因为这一段的机器码不是这个指令,所以就乱了
具体你可以T命令一步步走,每走一步就用D查看076a:0 2f,就会发现在mov sp,32h执行后发现机器指令突然变化了,导致mov bx,076a,为什么我也不知道!而且好像也不能这么写mov sp,32h,最好用BP,不用SP tk2003 发表于 2014-1-24 16:05 static/image/common/back.gif
1.在最后一张里,刚执行了两个t,指令就跳到第四行了,第三行mov sp,0032被跳过了
请看王爽书本第73页,写的很 ...
请看第二张图和第一张图的cs:IP 我怀疑应该是dosbox和debug的版本问题.
cs 能定义数据吗?
这个程序我也自己编写了 和你现了相同的情况是不是栈段 和数据段重复的原应啊 支持小甲鱼,赞点鱼币回来下载 支持小甲鱼,赞点鱼币回来下载 支持小甲鱼,赞点鱼币回来下载 我编写了许多程序调试的时候都是这种情况可能是在执行 mov ss,ax的时候 SP就自动指向栈定了 还没学到这里,先看看大家怎么解决的~~:sweat: 路过看看= = 我来学习一下。 我知道你错哪里了,你应该把sp=20h(sp指向栈底)因为,10h表示10进制的32,而不是sp=32h,32h表示十进制的50。 我知道你错哪里了,你应该把sp=20h(sp指向栈底)因为,20h表示10进制的32,而不是sp=32h,32h表示十进制的50。
还有在补充一下,你再int 21h的前面没有使mov ax, 4c00h这个语句,这样的话,程序是不会正常结束的! 20h=32 10h=16,王爽的书上,写的很详细了.
页:
[1]