| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 761 人关注过本帖
标题:王爽,实验3
只看楼主 加入收藏
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
王爽,实验3
图片附件: 游客没有浏览图片的权限,请 登录注册

单步调试遇到这种情况?我想是不是没有栈。。
2012-09-27 10:40
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
如果栈不对执行这个可能会出错罢 没代码我也不知道。。
2012-09-27 10:42
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
你的原程序发上来看看。。。

梅尚程荀
马谭杨奚







                                                       
2012-09-27 10:44
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
程序代码:
assume  cs:codesg
codesg  segment

  mov ax,2000h
  mov ss,ax
  mov sp,0h
  add sp,4h
  pop ax
  pop bx

 push ax

 push bx
  pop ax
  pop bx

 

 
  mov ax,4c00h
   int 21h
  codesg ends
  end
代码如上

实现自己既定的目标,必须能耐得住寂寞单干。
2012-09-27 10:44
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
;#Mode=DOS
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件

.model small
.stack 200h
.data
    szMsg db 'Hello World!',13,10,'$'
   
.CODE
START:
    mov ax,@data
    mov ds,ax
    lea dx,szMsg
    mov ah,9
    int 21h
   
    ;暂停,任意键关闭
    mov ah,1
    int 21h
    mov ah,4ch     ;结束,可以修改al设置返回码
    int 21h
END START


你看MASMPlus带的这个模版代码多好 为啥不在这个基础上写非要自己写一个呢

我执行了一下貌似也出错 我记得好像没有堆栈段的话会自动给一个 DOS的不懂 让有容就大给你说说罢


[ 本帖最后由 zklhp 于 2012-9-27 10:50 编辑 ]
2012-09-27 10:49
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
这个我下载了,我觉得初学用书上 的编译器比较好学一点。
等以后有点基础就换masmplus

[ 本帖最后由 小习小习 于 2012-9-27 10:53 编辑 ]

实现自己既定的目标,必须能耐得住寂寞单干。
2012-09-27 10:52
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
以下是引用小习小习在2012-9-27 10:52:34的发言:

这个我下载了,我觉得初学用书上 的编译器比较好学一点

上面的代码是书上的 然后你执行 出错 是这个意思么

也有可能 因为书上的代码要在16位的DOS里面执行 而你是用的一个windows带的虚拟机 还真的DOS有区别也正常、、、
2012-09-27 10:54
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
回复 7楼 zklhp
恩是书上的,哦,还有这种 情况。学习了。谢谢Z版大哥。。。

实现自己既定的目标,必须能耐得住寂寞单干。
2012-09-27 10:57
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:10 
我感觉是这里的问题
mov ss,ax
mov sp,0h
add sp,4h
我连续试了add sp, xxh几个数 发现2h, 5h 不会提示错误 但会直接跳出单步 6h以上就可以
所以感觉是堆栈溢出的问题 后来去查了下 看到这个你参考下:
你的错误在于堆栈设置的太小,sp=4时,如果发生硬件中断(如每秒18.2次的时钟中断),会导致堆栈空间不够用,sp跨段,中断处理程序中的iret指令没法返回正确的地址,也就是跑飞了,运行到一个存在非法指令的地址上去了,所以才会有你看到的结果。
有人说只有sp=4时才出现错误,sp=0,sp=2的情况不出现错误,试验一下确实如此。
硬件中断产生时,需要压入堆栈内6个字节。
调用中断的命令int x
相当于下面这四句:
pushf
push cs
push ip
jmp XXXX:XXXX  ;xxx:xxxx是从中断向量表中查出的地址。
只有在sp=4时导致压入的cs和ip不在一起,无法正确返回。
如果让sp=3,在我的机器上,会让debug直接退出,并不会出现错误。
结论,避免出现这种错误的方法就是让sp足够大,绝对不能小于6。

梅尚程荀
马谭杨奚







                                                       
2012-09-27 11:06
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
回复 9楼 有容就大
貌似明白了一点,还没学到中断,谢谢有容大哥了

实现自己既定的目标,必须能耐得住寂寞单干。
2012-09-27 11:11
快速回复:王爽,实验3
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019223 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved