鱼C论坛

 找回密码
 立即注册
查看: 3039|回复: 10

[已解决]关于中断向量表

[复制链接]
发表于 2022-3-23 17:48:29 | 显示全部楼层 |阅读模式
2鱼币
中断向量表自己编写中断程序的时候,都是用串指令传送到0:200的内存处,通过ds:[si],还有es:[di]
我想问一下,为什么不是直接往0:200处写入呢?


最佳答案
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,你的程序就可以按照驻留内存的方式结束。你所编写的中断服务程序就会受到操作系统的保护,别的程序始终可以进行正常调用你所编写的中断服务程序。  

最佳答案

查看完整内容

你的代码被加载到什么内存地址不是由你,而是由操作系统来决定的,具体地址要看操作系统已经占用了多少,在此基础上向上浮动,水涨船高,你不可能有办法把程序指定加载到 0:200 这个地址内,如果要向这片内存写入代码,必须使用数据传送指令。 DOS 一共预设了 256 个中断,中断号范围 0~ffh,每个中断向量占用 4 个字节,中断向量表一共 400h 字节,占用内存 0:0 ~ 0:400 的范围,0:200 开始的内存实际上是用于 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,你的程序就可以按照驻留内存的方式结束。你所编写的中断服务程序就会受到操作系统的保护,别的程序始终可以进行正常调用你所编写的中断服务程序。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-23 18:51:06 | 显示全部楼层
怎么直接写?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-23 21:53:46 | 显示全部楼层
直接写你得搞清楚要写进去的代码长度,然后用循环一个一个写进去多麻烦啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-23 22:02:56 | 显示全部楼层
snrjtg1 发表于 2022-3-23 21:53
直接写你得搞清楚要写进去的代码长度,然后用循环一个一个写进去多麻烦啊

为什么要知道代码长度呢?就像写其它的代码一样,直接写到0:200的这段内存,用这段内存作为代码段不可以吗?还是说代码段是系统随机给的,只能在它给的基础上,复制到0:200这段内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-23 22:05:04 | 显示全部楼层

直接在0:200这段内存作为代码段,写入东西不可以吗?然后直接用,就不需要进行串指令传送.还是说在文本的情况下,导入到cmd里,代码段内存只能随机给,不能刻意去指定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是的,系统会随机分配一个代码段
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-23 22:21:53 | 显示全部楼层
个人理解:如果用编辑器写的话,cs和ds等都是操作系统分配的,0:200这段空间系统肯定不会给你用,只能传送过去。要不然就在debug下,往0:200处直接写。也可能考虑程序“通用性”的问题,要都适用才行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-26 10:55:03 | 显示全部楼层
你在说啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-26 13:31:54 | 显示全部楼层
这个涉及到内核操作呀,你一个用户,哪能随便动我内核
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-15 00:23:30 | 显示全部楼层
这段空间就是规定用来作为中断向量表啊,你把它用作其它用途就破坏了中断机制啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 14:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表