DSFEF 发表于 2022-3-23 17:48:29

关于中断向量表

中断向量表自己编写中断程序的时候,都是用串指令传送到0:200的内存处,通过ds:,还有es:
我想问一下,为什么不是直接往0:200处写入呢?


jackz007 发表于 2022-3-23 17:48:30

本帖最后由 jackz007 于 2022-3-25 19:48 编辑

      你的代码被加载到什么内存地址不是由你,而是由操作系统来决定的,具体地址要看操作系统已经占用了多少,在此基础上向上浮动,水涨船高,你不可能有办法把程序指定加载到 0:200 这个地址内,如果要向这片内存写入代码,必须使用数据传送指令。
      DOS 一共预设了 256 个中断,中断号范围 0~ffh,每个中断向量占用 4 个字节,中断向量表一共 400h 字节,占用内存 0:0 ~ 0:400 的范围,0:200 开始的内存实际上是用于存放 int 80h 及以后中断向量的内存空间,属于操作系统的占用空间,原则上我们不可以向这片内存写入代码,因为,如果有程序编写了 int 80h ~ int ffh 的自用中断,之前被写入内存地址 0:200 的代码就会被无条件覆盖,你的中断处理程序就会意外被破坏,而这一切都是因为你自己没有遵守约定,把代码写入了受操作系统保护的内存区域造成。
      编写自用中断服务程序可以使用 DOS 的 TSR 技术,只要以 ah = 31h 调用 int 21h,你的程序就可以按照驻留内存的方式结束。你所编写的中断服务程序就会受到操作系统的保护,别的程序始终可以进行正常调用你所编写的中断服务程序。

人造人 发表于 2022-3-23 18:51:06

怎么直接写?

snrjtg1 发表于 2022-3-23 21:53:46

直接写你得搞清楚要写进去的代码长度,然后用循环一个一个写进去多麻烦啊

DSFEF 发表于 2022-3-23 22:02:56

snrjtg1 发表于 2022-3-23 21:53
直接写你得搞清楚要写进去的代码长度,然后用循环一个一个写进去多麻烦啊

为什么要知道代码长度呢?就像写其它的代码一样,直接写到0:200的这段内存,用这段内存作为代码段不可以吗?还是说代码段是系统随机给的,只能在它给的基础上,复制到0:200这段内存

DSFEF 发表于 2022-3-23 22:05:04

人造人 发表于 2022-3-23 18:51
怎么直接写?

直接在0:200这段内存作为代码段,写入东西不可以吗?然后直接用,就不需要进行串指令传送.还是说在文本的情况下,导入到cmd里,代码段内存只能随机给,不能刻意去指定

人造人 发表于 2022-3-23 22:10:07

DSFEF 发表于 2022-3-23 22:05
直接在0:200这段内存作为代码段,写入东西不可以吗?然后直接用,就不需要进行串指令传送.还是说在文本的情 ...

是的,系统会随机分配一个代码段

凡得友 发表于 2022-3-23 22:21:53

个人理解:如果用编辑器写的话,cs和ds等都是操作系统分配的,0:200这段空间系统肯定不会给你用,只能传送过去。要不然就在debug下,往0:200处直接写。也可能考虑程序“通用性”的问题,要都适用才行。

C丁洞杀O 发表于 2022-3-26 10:55:03

你在说啥?

超级无敌磊果果 发表于 2022-3-26 13:31:54

这个涉及到内核操作呀,你一个用户,哪能随便动我内核

发表于 2022-5-15 00:23:30

这段空间就是规定用来作为中断向量表啊,你把它用作其它用途就破坏了中断机制啊
页: [1]
查看完整版本: 关于中断向量表