人造人 发表于 2017-6-12 14:13:38

kyowjw01 发表于 2017-6-12 14:07
又看了一遍,还是不明白。现在只知道一个cmd只能执行一次这个程序。因为是模拟的中断?

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

我问你,第2次执行完这个程序,ds:200、ds:202 存储的是什么?还是原来的int 9中断例程的入口地址吗?

kyowjw01 发表于 2017-6-12 15:40:31

人造人 发表于 2017-6-12 14:13
;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
                push es:
      ...

新的int9中断例程的入口地址,不是原来的int9中断例程的入口地址。但自己感觉还是回答的晕乎乎的。

人造人 发表于 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:      ;CS,IP入栈,(IP)=cs:,当此中断例程执行时(CS)=0

那原来的int9中断例程的入口地址哪去了?
在新的int9中断例程中需要原来的int9中断例程的入口地址

人造人 发表于 2017-6-12 17:27:10

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

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

如果上面程序执行两次,会发生什么?

kyowjw01 发表于 2017-6-13 10:01:06

人造人 发表于 2017-6-12 17:27
如果上面程序执行两次,会发生什么?

会报错。{:10_245:}CS:IP还在中断里执行。

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

人造人 发表于 2017-6-13 13:33:13

kyowjw01 发表于 2017-6-13 10:01
会报错。CS:IP还在中断里执行。

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

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


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

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

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

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

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

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

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

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




人造人 发表于 2017-6-13 14:07:16

再补两张图

kyowjw01 发表于 2017-6-13 14:56:27

人造人 发表于 2017-6-13 13:33
你的基础,我大概摸得差不多了,不继续提问了,直接揭示答案了




{:10_258:}好像明白了。谢谢!

不知道是不是有意写错的。
程序第一次执行完后:
中断向量表中保存的是 0h:204h
因为
mov word ptr es:, 204h
mov word ptr es:, 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。

人造人 发表于 2017-6-13 15:52:30

kyowjw01 发表于 2017-6-13 14:56
好像明白了。谢谢!

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



这张图片上的数应该怎么读?

mov word ptr es:, 204h
mov word ptr es:, 0

es: 写入了204h,
es:写入了0
按照你的读法却变成了 20ch:40ah ?

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

自己百度:大端小端

kyowjw01 发表于 2017-6-13 15:52:33

人造人 发表于 2017-6-13 14:07
再补两张图

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

补的两张图其实xp中也能看,不过有一点差别。

人造人 发表于 2017-6-13 15:58:33

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

^_^
不一样,bochs和你要调试的系统独立,如果debug无法调试了,可以试试bochs
上面那两张图,用debug没办法截,因为dos已经挂了,debug运行在dos下

kyowjw01 发表于 2017-6-13 16:05:36

人造人 发表于 2017-6-13 15:52
这张图片上的数应该怎么读?

mov word ptr es:, 204h


我知道有大端和小端的概念。大端和小端跟CPU有关。我应该没有读错吧?
0000h:0204h放的是新的int9中断程序。
而020Ch:040Ah放的是原先的int9中断程序。

kyowjw01 发表于 2017-6-13 16:09:36

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

嗯,好的。^_^

人造人 发表于 2017-6-13 16:10:02

本帖最后由 人造人 于 2017-6-13 16:11 编辑

kyowjw01 发表于 2017-6-13 16:05
我知道有大端和小端的概念。大端和小端跟CPU有关。我应该没有读错吧?
0000h:0204h放的是新的int9中断程 ...

你这么问,就说明你应该好好学习一下大端和小端的概念
因为你就是读错了

kyowjw01 发表于 2017-6-13 16:30:57

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

我滴大哥,我真没错。0000:0204h。0000h是段地址,0204h是偏移地址。另外个同理。

人造人 发表于 2017-6-13 16:40:47

kyowjw01 发表于 2017-6-13 16:30
我滴大哥,我真没错。0000:0204h。0000h是段地址,0204h是偏移地址。另外个同理。

抱歉,我把我自己给搞晕了,你没有弄错,是我弄错了

人造人 发表于 2017-6-13 16:43:17

kyowjw01 发表于 2017-6-13 14:56
好像明白了。谢谢!

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


第二次是真的改写成功了,正因为改写成功,程序才弹出这个

kyowjw01 发表于 2017-6-13 16:49:26

人造人 发表于 2017-6-13 16:43
第二次是真的改写成功了,正因为改写成功,程序才弹出这个

好的。这下我明白了。原来弹出窗口的意思是代表改写成功了。嘿嘿!多谢啦!!
^-^

kyowjw01 发表于 2017-6-13 16:50:12

人造人 发表于 2017-6-13 16:40
抱歉,我把我自己给搞晕了,你没有弄错,是我弄错了

没事没事,有争议才会记得更牢固。互相学习嘛。{:10_279:}

人造人 发表于 2017-6-13 16:51:35

kyowjw01 发表于 2017-6-13 14:56
好像明白了。谢谢!

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


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

push es:
pop es:
还没有执行
然后发生中断,20ch:204h 不是正确的地址(偏移地址改了,段地址还没有),然后去这个地址执行,然后就出错了
页: 1 [2] 3
查看完整版本: 实验15 安装新的int9中断例程 及其 切换颜色程序的问题