在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 竟然没报错 而是直接把程序执行完了
怎么会是这种情况。
高手们帮忙解释解释。
-------------------------------------
下面是编写的代码:
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,中间没有暂停,直到结束时才有入栈操作。所以到结束时,栈满出错。
用t,在前面都要系统默认的栈,没问题,单步到ss和sp都赋值后,再有2个数据入栈,栈就不够了。
用g,中间没有暂停,直到结束时才有入栈操作。所以到结束时,栈满出错。
作者: shzhfu 发布时间: 2011-04-03
LS正解!!!
作者: masmaster 发布时间: 2011-04-03
引用 1 楼 shzhfu 的回复:
t或g在断点处都要保存相关信息。
用t,在前面都要系统默认的栈,没问题,单步到ss和sp都赋值后,再有2个数据入栈,栈就不够了。
用g,中间没有暂停,直到结束时才有入栈操作。所以到结束时,栈满出错。
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28