鱼C论坛

 找回密码
 立即注册
楼主: kyowjw01

[汇编作业] 实验15 安装新的int9中断例程 及其 切换颜色程序的问题

[复制链接]
发表于 2017-6-12 14:13:38 | 显示全部楼层
kyowjw01 发表于 2017-6-12 14:07
又看了一遍,还是不明白。现在只知道一个cmd只能执行一次这个程序。因为是模拟的中断?


;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
                push es:[9*4]
                pop es:[200h]
                push es:[9*4+2]
                pop es:[202h]

我问你,第2次执行完这个程序,ds:200、ds:202 存储的是什么?还是原来的int 9中断例程的入口地址吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-12 15:40:31 | 显示全部楼层
人造人 发表于 2017-6-12 14:13
;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
                push es:[9*4]
      ...

新的int9中断例程的入口地址,不是原来的int9中断例程的入口地址。但自己感觉还是回答的晕乎乎的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-12 17:23:39 | 显示全部楼层
kyowjw01 发表于 2017-6-12 15:40
新的int9中断例程的入口地址,不是原来的int9中断例程的入口地址。但自己感觉还是回答的晕乎乎的。

                in al,60h                                        ;从端口60h读出键盘输入
                ;对int指令进行模拟,调用原来的int 9中断例程
                pushf                                                ;标志寄存器入栈
                call dword ptr cs:[200h]        ;CS,IP入栈,(IP)=cs:[200h],当此中断例程执行时(CS)=0

那原来的int9中断例程的入口地址哪去了?
在新的int9中断例程中需要原来的int9中断例程的入口地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-12 17:27:10 | 显示全部楼层
;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
        push es:[9 * 4]
        pop es:[200h]
        push es:[9 * 4 + 2]
        pop es:[202h]

        ;在中断向量表中设置新的int 9中断例程的入口地址
        cli                ;设置IF=0屏蔽中断
        mov word ptr es:[9 * 4], 204h
        mov word ptr es:[9 * 4 + 2], 0
        sti                ;设置IF=1不屏蔽中断

如果上面程序执行两次,会发生什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 10:01:06 | 显示全部楼层
人造人 发表于 2017-6-12 17:27
如果上面程序执行两次,会发生什么?

会报错。CS:IP还在中断里执行。
Q3.png
主要这个程序不能单步调试,我不知道怎么看,只能凭空想象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 13:33:13 | 显示全部楼层
kyowjw01 发表于 2017-6-13 10:01
会报错。CS:IP还在中断里执行。

主要这个程序不能单步调试,我不知道怎么看,只能凭空想象 ...

你的基础,我大概摸得差不多了,不继续提问了,直接揭示答案了

;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
        push es:[9 * 4]
        pop es:[200h]
        push es:[9 * 4 + 2]
        pop es:[202h]

        ;在中断向量表中设置新的int 9中断例程的入口地址
        cli                ;设置IF=0屏蔽中断
        mov word ptr es:[9 * 4], 204h
        mov word ptr es:[9 * 4 + 2], 0
        sti                ;设置IF=1不屏蔽中断

问题就是由上面这段代码产生的

上面代码就做了两件事
1.将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
2.在中断向量表中设置新的int 9中断例程的入口地址

程序还没有执行时:
中断向量表中保存的是 原来的int 9中断例程的入口地址

程序第一次执行完后:
中断向量表中保存的是 0h:240h
因为
mov word ptr es:[9 * 4], 204h
mov word ptr es:[9 * 4 + 2], 0

ds:200、ds:202 保存原来的int 9中断例程的入口地址

程序第二次执行完后:
中断向量表中保存的是 0h:240h
ds:200、ds:202 也保存 0h:240h

程序还没有执行.png
程序第一次执行完.png
程序第二次执行(还没有执行完).png
程序第二次执行结束(是结束了吧?已经不能继续了^_^).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 14:07:16 | 显示全部楼层
再补两张图
无标题1.png
无标题2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 14:56:27 | 显示全部楼层
人造人 发表于 2017-6-13 13:33
你的基础,我大概摸得差不多了,不继续提问了,直接揭示答案了

好像明白了。谢谢!

不知道是不是有意写错的。
程序第一次执行完后:
中断向量表中保存的是 0h:204h
因为
mov word ptr es:[9 * 4], 204h
mov word ptr es:[9 * 4 + 2], 0

ds:200、ds:202 保存原来的int 9中断例程的入口地址 20ch:40ah

程序第二次执行完后:
中断向量表中保存的是 0h:204h
预想要在ds:200处改写内存单元为40ah,被操作系统给制止了。并没有改写成功。


所以程序第二次执行完后:
中断向量表中保存的是 0h:204h
ds:200、ds:202处的内存单元被操作系统制止了,并没有保存成功。ds:200、ds:202依然是20ch:40ah。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 15:52:30 | 显示全部楼层
kyowjw01 发表于 2017-6-13 14:56
好像明白了。谢谢!

不知道是不是有意写错的。

133259prus172u1w1sru1q.png
这张图片上的数应该怎么读?

mov word ptr es:[9 * 4], 204h
mov word ptr es:[9 * 4 + 2], 0

es:[9 * 4] 写入了204h,
es:[9 * 4 + 2]写入了0
按照你的读法却变成了 20ch:40ah ?

ds:200、ds:202 保存原来的int 9中断例程的入口地址 20ch:40ah

自己百度:大端小端
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 15:52:33 | 显示全部楼层

这个是Ubuntu?版主二次中毒已深。
我是第一次看到Bochs模拟器,刚才网上查阅了一下,可以在PC机中模拟PC机包括硬件什么的。据说安卓上还能装XP。学习了,嘿嘿。

补的两张图其实xp中也能看,不过有一点差别。
Q4.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 15:58:33 | 显示全部楼层
kyowjw01 发表于 2017-6-13 15:52
这个是Ubuntu?版主二次中毒已深。
我是第一次看到Bochs模拟器,刚才网上查阅了一下,可以在P ...

^_^
不一样,bochs和你要调试的系统独立,如果debug无法调试了,可以试试bochs
上面那两张图,用debug没办法截,因为dos已经挂了,debug运行在dos下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 16:05:36 | 显示全部楼层
人造人 发表于 2017-6-13 15:52
这张图片上的数应该怎么读?

mov word ptr es:[9 * 4], 204h

我知道有大端和小端的概念。大端和小端跟CPU有关。我应该没有读错吧?
0000h:0204h放的是新的int9中断程序。
而020Ch:040Ah放的是原先的int9中断程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 16:09:36 | 显示全部楼层
人造人 发表于 2017-6-13 15:58
^_^
不一样,bochs和你要调试的系统独立,如果debug无法调试了,可以试试bochs
上面那两张图,用debug ...

嗯,好的。^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 16:10:02 | 显示全部楼层
本帖最后由 人造人 于 2017-6-13 16:11 编辑
kyowjw01 发表于 2017-6-13 16:05
我知道有大端和小端的概念。大端和小端跟CPU有关。我应该没有读错吧?
0000h:0204h放的是新的int9中断程 ...


你这么问,就说明你应该好好学习一下大端和小端的概念
因为你就是读错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 16:30:57 | 显示全部楼层
人造人 发表于 2017-6-13 16:10
你这么问,就说明你应该好好学习一下大端和小端的概念
因为你就是读错了

我滴大哥,我真没错。0000:0204h。0000h是段地址,0204h是偏移地址。另外个同理。
Q5.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 16:40:47 | 显示全部楼层
kyowjw01 发表于 2017-6-13 16:30
我滴大哥,我真没错。0000:0204h。0000h是段地址,0204h是偏移地址。另外个同理。

抱歉,我把我自己给搞晕了,你没有弄错,是我弄错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 16:43:17 | 显示全部楼层
kyowjw01 发表于 2017-6-13 14:56
好像明白了。谢谢!

不知道是不是有意写错的。

第二次是真的改写成功了,正因为改写成功,程序才弹出这个
133259x6hg56ap35qvgq27.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 16:49:26 | 显示全部楼层
人造人 发表于 2017-6-13 16:43
第二次是真的改写成功了,正因为改写成功,程序才弹出这个

好的。这下我明白了。原来弹出窗口的意思是代表改写成功了。嘿嘿!多谢啦!!
^-^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 16:50:12 | 显示全部楼层
人造人 发表于 2017-6-13 16:40
抱歉,我把我自己给搞晕了,你没有弄错,是我弄错了

没事没事,有争议才会记得更牢固。互相学习嘛。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 16:51:35 | 显示全部楼层
kyowjw01 发表于 2017-6-13 14:56
好像明白了。谢谢!

不知道是不是有意写错的。

执行完pop后
ds:200、ds:202 变成了 20ch:204h

push es:[9 * 4 + 2]
pop es:[202h]
还没有执行
然后发生中断,20ch:204h 不是正确的地址(偏移地址改了,段地址还没有),然后去这个地址执行,然后就出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 14:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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