. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->汇编语言学习交流区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  [讨论]第四章就开始接触的“中断”问题  [待解决] 回复[ 3次 ]   点击[ 999次 ]  
mess
[帖 主]   [ 发表时间:2008-03-26 10:09 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
下面是一个博客的帖子,说的是在做实验5.6的时候碰到的中断问题。其实关于中断问题从第四章第一个程序就开始了(虽然第一个程序实dos下运行没有问题)。根据汇编书前言提到的“知识屏蔽”,我们没必要深入了解中断问题,但是简单了解还是很有必要的:-)
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=8327&kindLevel=1&kindId=9631&postId=13172

下面是这篇博文主人的疑惑,大家讨论啊~~
(我觉得这三个问题感觉很绕口,不过根据经验越是绕口的问题解决后越能把知识理解清晰。:)
由此我产生疑问: 
1>是不是在DEBUG 中 -G 也是中断指令啊,会用到堆栈段. 
如果-G 不算中断指令,那么SS段的数据被改写了,像是运行了-T指令后的效果.为什么? 
2>若程序中只设置SS段地址而不初始SP的值,SS段能做为一个数据段来使用,即:DEBUG中-T指令运行的数据不保存在堆栈SS段中.为什么? 
3>若程序中只设置SS段地址而不初始SP的值,那么DEBUG 中T 指令运行后,保存的数据在哪个存储空间?是堆栈SS吗?
crazyman
[第1楼]   [ 回复时间:2008-03-26 16:15 ]   [引用]   [回复]   [ top ] 
荣誉值:152
信誉值:3
注册日期:2008-01-24 21:26
1>是不是在DEBUG 中 -G 也是中断指令啊,会用到堆栈段
================
我觉得从根本上来说G命令应该算不上中断命令吧。但是G命令运行到设置的断点的时候,却会调用其他的中断程序,可能是这个造成了栈空间数据被更改了。

2>若程序中只设置SS段地址而不初始SP的值,SS段能做为一个数据段来使用,即:DEBUG中-T指令运行的数据不保存在堆栈SS段中.为什么?
=====
我觉得这句话理由有问题。即使不设置sp,也存在栈空间啊,因为默认的ss,sp就是当前栈,T命令执行过程中必然会用到这个栈空间来存放数据。不过,当sp=0的时候,你默认的栈空间是ss指向的那个64K的内存空间。楼主可以根据sp的推算,然后去debug查看。

3>若程序中只设置SS段地址而不初始SP的值,那么DEBUG 中T 指令运行后,保存的数据在哪个存储空间?是堆栈SS吗?
--------------
不设置sp,就是将当前默认的sp与ss指向的当前栈空间的栈顶下一个字节。栈是任何时候都存在的。因为你的ss,sp必然都会有一个值。
mess
[第2楼]   [ 回复时间:2008-03-26 16:42 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
对于楼上说的第一个关于G命令的,我觉得G命令也有保存现场的操作。

当敲入G命令,程序会一直运行,当遇到MOV AX,4C00H INT 21H,这两条指令时候结束程序。
这两条指令是调用的21中断,功能如下
----
(5)、功能4CH 
功能描述:终止程序的执行,并可返回一个代码 
入口参数:AH=4CH 
AL=返回的代码 
出口参数:无 
---
在dos下,运行一个正确的程序会返回dos。在debug先用g命令运行程序,也会返回debug。下面是一个程序g命令的实例:
-t

AX=0000  BX=0000  CX=002F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C48  ES=0C48  SS=0C58  CS=0C58  IP=001D   NV UP EI PL NZ NA PO NC
0C58:001D B8580C        MOV     AX,0C58
-t

AX=0C58  BX=0000  CX=002F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C48  ES=0C48  SS=0C58  CS=0C58  IP=0020   NV UP EI PL NZ NA PO NC
0C58:0020 8ED8          MOV     DS,AX
-g
good student:class2 jack

Program terminated normally
-r
AX=0C58  BX=0000  CX=002F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C48  ES=0C48  SS=0C58  CS=0C58  IP=0020   NV UP EI PL NZ NA PO NC
0C58:0020 8ED8          MOV     DS,AX
-t

AX=0C58  BX=0000  CX=002F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C58  ES=0C48  SS=0C58  CS=0C58  IP=0022   NV UP EI PL NZ NA PO NC
0C58:0022 8D160200      LEA     DX,[0002]                          DS:0002=6F67
-
我们可以看到g命令前后cs和ip的值没有变化,标志寄存器的值都没有变化。如果g命令没有中断的保护现场操作,这点应该很难解释啊。虽然g命令最后执行了int 21h中断,执行21h中断前保护的现场不可能满足示例中的前后寄存器数据不变的需要。
startasm
[第3楼]   [ 回复时间:2008-03-26 17:02 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-11-27 20:05
对与楼主问的第二、三个问题是这样的,中断的保护现场的步骤是一定的(计算机可是很死板的啊:-)),一定会用“栈”保护现场,也就是说必须用到ss、sp。

这里有个初学者的疑问。
当执行指令add ax,3这条指令的时候,ax是否是0?答案是不一定,ax值在执行指令之前是有值的(哪怕它是0),其实也是说ax是一个寄存器,它不可能没有值,只有当ax被其他值覆盖了它才发生变化,否则会一直保存上次被覆盖后的值。

这个和设置不设置ss、sp是一样的,sp总会有个值,那么当发生中断时也总会对ss、sp做操作,保护现场。所以也不存在不保存在“栈”的情况出现。但这里是“栈”而不是“栈段”,栈段是我们规定的,在没和ss联系在一起前是没有意义的,只是内存中的一段空间罢了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved