王爽著课本中关于安装中断处理程序的疑问

zhukrmail 2015-07-19 10:13:14
王爽老师在《汇编语言》第12章《内中断》中讲解了中断处理程序的编写与安装。以处理第N号中断为例,步骤可以概括如下

1. 编写中断处理代码
2. 拷贝中断处理代码到一处空内存中。书中拷贝到了0200h:0处,默认此处内存是空闲的
3.修改中断表,将N号中断的处理指针指向0200h:0

在第15章《外中断》中出现了一个处理9号中断的范例。步骤概括如下

1. 编写中断处理代码
2. 不拷贝中断处理代码,直接修改中断表。将9号中断处理指针指向安装程序中的中断处理部分

(说明:中断处理代码储存在中断安装程序的源码中。运行中断安装程序时,中断处理代码被同时拷贝到内存中)

疑问:

必须要拷贝中断处理代码到空内存中吗?为何同为中断处理,这两个例子有不同的做法
如果答案是肯定的,为何第二例可以不拷贝?
如果答案是否定的,第一例的拷贝过程是否画蛇添足?

我的猜测:

拷贝处理代码,是因为安装程序所在内存区域在中断安装完成之后可能会被其他程序改写。若采用例二中的做法,中断处理可能失效。因此例二的写法只是偷懒,是不正确的。
进一步的思考,虽然安装程序运行时内存可能被改写,例一中0200h:0处内存同样可能被改写。因此例一也不是保险做法。在DOS中因为CPU运行在实模式下,不可能有真正安全的做法。

初学汇编,望各位能指点迷津。在此先谢过!
...全文
744 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
做而论道_CS 2016-02-04
  • 打赏
  • 举报
回复
他的说法是错误的。 楼主应该看看【驻留程序】的方法。
yuexicheng 2015-08-15
  • 打赏
  • 举报
回复
1、为什么需要拷贝 在计算机中中断随时可能发生,这就意味着可能随时需要调用中断处理程序来处理中断问题,因此作为中断处理程序就需要一直存在,你也可以理解为中断处理程序需要常驻内存(其实中断处理程序也可以不必常驻内存,因为有的中断可能很久都不发生一次,或者说发生的频率较低,自然需要调用中断处理程序的时候就比较少,可以将这样的中断处理程序调入磁盘,待需要用到的时候再调入内存,毕竟内存时很稀缺的资源,当然不能让一个不常用的中断处理程序白白占用宝贵的内存资源,这就是内存管理,这又涉及到另外的话题了,但是不管怎么说作为中断处理程序它是必须一直存在的,这种存在既可以常驻内存就是你这儿所说的拷贝,也可以是存在于磁盘中,在需要的时候调入内存),至于你说的9号中断的问题,找了书看了一下,仔细看你会发现这个新的9号中断处理程序之所以没有拷贝到内存是因为没有必要,9号中断处理程序是由BIOS提供的用于处理键盘输入的程序,作者如果需要重写9号中断处理程序要涉及很多硬件细节,新的9号中断只是对输入ESC时进行了特殊处理(改变颜色),其他输入作者依旧调用了原来的BIOS的中断处理程序进行处理只是改int为call,原来的9号中断处理程序就是一只存在于内存中的。如果你非要较真说将新的9号中断处理程序拷贝到内存也没有问题,这只是会导致你在这个程序退出后,当处理键盘的ESC输入时会改变字符显示颜色,而且只会改变特定位置的字符颜色即0xb800:160*12+40*2处的字符颜色,所以作者才未将这个处理过程进行拷贝。 2、安全问题 正如你所说在实模式下的代码、数据确实没有安全的,因为程序可以在任何一个数据段之间进行访问,至于要mov ds,ax即可,所以当一段代码正常执行时没有问题但是它不怀好意时,实模式的内存访问机制很难做出有效的措施,因此才有了后来保护模式的出现,建议你在看完实模式汇编后如果有兴趣的话可以了解下保护模式汇编,在保护模式下你对安全的疑问都将得到解答
zhukrmail 2015-07-21
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
安全,是指大家都在规范的情况下的说法,就象自己家里的东西的安全性似的。 说是把代码搬到 0200:0000 处,这里是安全的?这个说法恐怕欠妥,这里通常是 dos 的核心区域了吧。怀疑说的是 0000:0200 (0020:0000) 处,这里是中断向量的后半部分,通常是不被使用的,或可被你暂用;但也不保险,要是再来个和你一样想法的程序也这样干呢? 不拷贝代码,这在程序运行期间是没有问题的;如果程序要结束退出,这个功能还要继续,dos 提供了个 TSR 方法(int27h 或 int21h 的 AH=31h),即驻留退出,程序在结束时保留指定大小的内存,这样这部分内存不会被后来的程序占用,相应的中断功能也可正常。
是我疏忽,将地址打错了。非常感谢!
赵4老师 2015-07-20
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
zara 2015-07-20
  • 打赏
  • 举报
回复
安全,是指大家都在规范的情况下的说法,就象自己家里的东西的安全性似的。
说是把代码搬到 0200:0000 处,这里是安全的?这个说法恐怕欠妥,这里通常是 dos 的核心区域了吧。怀疑说的是 0000:0200 (0020:0000) 处,这里是中断向量的后半部分,通常是不被使用的,或可被你暂用;但也不保险,要是再来个和你一样想法的程序也这样干呢?
不拷贝代码,这在程序运行期间是没有问题的;如果程序要结束退出,这个功能还要继续,dos 提供了个 TSR 方法(int27h 或 int21h 的 AH=31h),即驻留退出,程序在结束时保留指定大小的内存,这样这部分内存不会被后来的程序占用,相应的中断功能也可正常。
  • 打赏
  • 举报
回复
嗒滴嗒...嗒滴嗒...嗒嗒... 大喇叭开始广播了。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧