注册 登录
编程论坛 汇编论坛

王爽,实验3

小习小习 发布于 2012-09-27 10:40, 761 次点击
只有本站会员才能查看附件,请 登录

单步调试遇到这种情况?我想是不是没有栈。。
11 回复
#2
zklhp2012-09-27 10:42
如果栈不对执行这个可能会出错罢 没代码我也不知道。。
#3
有容就大2012-09-27 10:44
你的原程序发上来看看。。。
#4
小习小习2012-09-27 10:44
程序代码:
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
代码如上
#5
zklhp2012-09-27 10:49
程序代码:

;#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 编辑 ]
#6
小习小习2012-09-27 10:52
这个我下载了,我觉得初学用书上 的编译器比较好学一点。
等以后有点基础就换masmplus

[ 本帖最后由 小习小习 于 2012-9-27 10:53 编辑 ]
#7
zklhp2012-09-27 10:54
以下是引用小习小习在2012-9-27 10:52:34的发言:

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

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

也有可能 因为书上的代码要在16位的DOS里面执行 而你是用的一个windows带的虚拟机 还真的DOS有区别也正常、、、
#8
小习小习2012-09-27 10:57
回复 7楼 zklhp
恩是书上的,哦,还有这种 情况。学习了。谢谢Z版大哥。。。
#9
有容就大2012-09-27 11:06
我感觉是这里的问题
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。
#10
小习小习2012-09-27 11:11
回复 9楼 有容就大
貌似明白了一点,还没学到中断,谢谢有容大哥了
#11
小习小习2012-09-27 12:06
新发现,在王爽第5章5.7节图5.19讲了有课能 在那段空间存储了重要的数据或代码,不能随意更改,好像有可能是安全问题
#12
有容就大2012-09-27 14:38
回复 11楼 小习小习
他是说在0:200h-02ffh这段空间是安全的 一般系统重要的东西不会放在这里 我们能用这个空间并随意改写其中的内容

你那个程序的主要问题还是在于栈的大小不适应硬中断的产生时的需求。
关键是这个 ‘压入6个字节’
pushf
push cs
push ip

栈是4个字节的话 压栈时刚好把cs / ip割断了。
1