+ -
当前位置:首页 → 问答吧 → 在baidu遇到的一个问题,搞不清楚了

在baidu遇到的一个问题,搞不清楚了

时间:2011-04-03

来源:互联网

刚刚在百度上逛的时候看到这个问题:
-------------------------------------
下面是编写的代码:
assume cs:code,ds:data,ss:stack
data segment
  db 'ibm '
  db 'dec '
  db 'dos '
  db 'vax '
data ends
stack segment
  dw 0
stack ends
code segment
start:mov ax,data
  mov ds,ax
  mov ax,stack
  mov bx,0
  mov ss,ax
  mov sp,2
  mov si,0
  mov cx,4
  s1:push cx
  mov cx,3
  mov si,0
  s:mov al,[bx+si]
  and al,11011111b
  mov [bx+si],al
  inc si
  loop s
  pop cx
  add bx,10h
  loop s1
  mov ax,4c00h
  int 21h
code ends
end start
在Debug下加载后用t命令单步执行,当执行到mov si,0时直接显示程序正常退出是什么意思?用g命令却能直接执行到mov ax,4c00h,此时查看内存,上面定义的小写字母却都能变成了大写字母。
请问为什么执行到mov si,0时会出现这样的现象
----------------------------------------------------------------------------
我的回答:
执行到mov si,0时直接显示程序正常退出 是因为你的栈太小了 
你单步调试,debug会用栈保存现场的,你定义sp为2,不够保存 就栈益处
你把sp设为16,就够了,执行到mov si,0就不会结束
你程序我调了下,执行mov si,0时显示程序正常退出,我看了下ds:0
发现程序的确自动是执行完了,ds:0 确实都变成大写了 ,其原因不清楚.到论坛问高手门吧
按说这种情况debug会报错,为什么它这里没有报错 就直接执行完了。。。。
--------------------------------------------------------------------
我的疑问:他那个程序很奇怪啊,sp设2 后单步执行mov si,0; 后debug 竟然没报错 而是直接把程序执行完了 
怎么会是这种情况。
高手们帮忙解释解释。 

作者: yxinxin1989   发布时间: 2011-04-03

t或g在断点处都要保存相关信息。

用t,在前面都要系统默认的栈,没问题,单步到ss和sp都赋值后,再有2个数据入栈,栈就不够了。

用g,中间没有暂停,直到结束时才有入栈操作。所以到结束时,栈满出错。

作者: shzhfu   发布时间: 2011-04-03

LS正解!!!

作者: masmaster   发布时间: 2011-04-03

引用 1 楼 shzhfu 的回复:
t或g在断点处都要保存相关信息。

用t,在前面都要系统默认的栈,没问题,单步到ss和sp都赋值后,再有2个数据入栈,栈就不够了。

用g,中间没有暂停,直到结束时才有入栈操作。所以到结束时,栈满出错。

恩.你可以帮我编译下程序吗?
你试试用debug单步执行到mov sp,2后面的mov si,0时候,再单步就要溢出对吧?
但你可以试试再单步后程序就自己执行完了噢。
一般栈溢出这时候不就要报错吗!它却没报错而是执行完程序,显示program terminated normally
我在加载到内存时候-d ds:0看了下都还是小写,
在-t mov si,0指令后,由-d ds:0看了下都是大写的了...
感到奇怪!

作者: yxinxin1989   发布时间: 2011-04-03

来学习了

作者: xiaoheixia014   发布时间: 2011-04-03