|
主题 : : 关于第272页int9 [待解决] |
回复[ 5次 ]
点击[ 501次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-01-24 17:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-07 11:14 |
就是这句
call dword ptr cs:[200h];当此中断例程执行时(cs)=0
这句话是执行老的中断int9,就是在0:[200h]单元处,我的问题是CS从什么时间变成0的
这是我的想法
按下键盘时:
1、取中断,标志寄存器入栈。tf,if=0,CS,IP入栈,这时栈中内容为
|IP|
|CS|
|标|
2、ip=n*4,cs=n*4+2,
3、进入了自己写的int9程序,push ax,push bx,push cx,push es这时栈内容为
|es|
|cx|
|bx|
|ax|
|IP|
|CS|
|标|
4、pushf,这时栈内容为:
|标|
|es|
|cx|
|bx|
|ax|
|IP|
|CS|
|标|
5、调用老的int9中断,用了call dword ptr 0:[200h],call可以变为push CS,和push IP,这时栈变为
|IP|
|CS|
|标|
|es|
|cx|
|bx|
|ax|
|IP|
|CS|
|标|
6、当老int9执行完后,老int9有一个iret指令,正好把ip,cs,标志寄存器都出栈.栈变为
|es|
|cx|
|bx|
|ax|
|IP|
|CS|
|标|
7、执行到int9ret:pop es,pop cx,pop bx,pop ax,
|IP|
|CS|
|标|
8、执行int9ret:iret
栈中什么也没有了。
我的问题是CS从始至终都没有变,CS的内容什么时间为0的。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-01-24 21:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
楼上分析了N长,好像没说到点子上。
call dword ptr cs:[200]
1.首先,call dword ptr 指令 相当于push cs ,push ip , jmp dword ptr cs:[200] ,而jmp是要修改cs,ip的。修改后(cs)=(cs:[200+2]),而(ip)= (cs:[200]).
2.这样,我们需要看的就是cs:[200+2]和cs:[200]的内容了。我们知道,这两个内容是老int 9中断向量表中数据。所以,我们想知道cs为什么为0了,以及到底应不应该是0,我们只要去看一下中断向量表中对应的数据不久全知道了。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-01-25 11:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-07 11:14 |
那么中断向量表中CS和IP都不为0
-d 0000:0000
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9F 03 8B 01 70 00 h.....p.......p.
0000:0010 8B 01 70 00 B9 06 0C 02-40 07 0C 02 FF 03 0C 02 ..p.....@.......
0000:0020 46 07 0C 02 0A 04 0C 02-3A 00 9F 03 54 00 9F 03 F.......:...T...
0000:0030 6E 00 9F 03 88 00 9F 03-A2 00 9F 03 FF 03 0C 02 n...............
0000:0040 A9 08 0C 02 A4 09 0C 02-AA 09 0C 02 5D 04 0C 02 ............]...
0000:0050 B0 09 0C 02 0D 02 DB 02-C4 09 0C 02 8B 05 0C 02 ................
0000:0060 0E 0C 0C 02 14 0C 0C 02-1F 0C 0C 02 AD 06 0C 02 ................
0000:0070 AD 06 0C 02 A4 F0 00 F0-37 05 0C 02 4A 68 00 C0 ........7...Jh..
可以看到9*4=24h,9*4+2=26h中的内容都不为零,这怎么解释呀?
我认为,当键盘按下时,标志寄存器入栈,CS,IP入栈,这时为了查找0:24h和0:26h中的内容,把CS赋值为0,把IP变为24h,然后再查找cs:ip,cs:[ip+2]中的内容所确定的内存中的指令,这就是说,不用看中断向量表,只要执行中断,CS就必定是0.这样理解应该没问题了吧。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-01-25 21:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
恩。楼上说的很有道理。我理解有偏差,我以为问的是call执行后cs的内容呢。没有去看程序,凭空分析的。呵呵。
看了一下书上的程序,确实,中断的时候,必然要去中断向量表中查找对应的中断例程的入口位置,而中断向量表是段地址为0的,所以,应该是中断例程在保存好当前cpu状态后就有相应指令修改了cs,ip的值,指向中断向量表中对应的位置了。
惭愧啊!
受教了! | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-03-08 01:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:53
信誉值:0
注册日期:2008-02-09 02:55 |
那么中断向量表中CS和IP都不为0
-d 0000:0000
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9F 03 8B 01 70 00 h.....p.......p.
0000:0010 8B 01 70 00 B9 06 0C 02-40 07 0C 02 FF 03 0C 02 ..p.....@.......
0000:0020 46 07 0C 02 0A 04 0C 02-3A 00 9F 03 54 00 9F 03 F.......:...T...
0000:0030 6E 00 9F 03 88 00 9F 03-A2 00 9F 03 FF 03 0C 02 n...............
0000:0040 A9 08 0C 02 A4 09 0C 02-AA 09 0C 02 5D 04 0C 02 ............]...
0000:0050 B0 09 0C 02 0D 02 DB 02-C4 09 0C 02 8B 05 0C 02 ................
0000:0060 0E 0C 0C 02 14 0C 0C 02-1F 0C 0C 02 AD 06 0C 02 ................
0000:0070 AD 06 0C 02 A4 F0 00 F0-37 05 0C 02 4A 68 00 C0 ........7...Jh..
可以看到9*4=24h,9*4+2=26h中的内容都不为零,这怎么解释呀?
我认为,当键盘按下时,标志寄存器入栈,CS,IP入栈,这时为了查找0:24h和0:26h中的内容,把CS赋值为0,把IP变为24h,然后再查找cs:ip,cs:[ip+2]中的内容所确定的内存中的指令,这就是说,不用看中断向量表,只要执行中断,CS就必定是0.这样理解应该没问题了吧。
------------------
回复:
你这是跟踪到哪步后的内存显示?
肯定是改写老INT 9中断向量之前的吧?
如果是,当然不为零,
因为老的中断向量本来就是0227:0A04H
如果你用Debug的g命令直接运行到MOV AX,4C00H处,
你再用d命令看看26H处是不是0了。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-03-08 01:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:53
信誉值:0
注册日期:2008-02-09 02:55 |
0CDF:0026 FF362600 PUSH [0026]
0CDF:002A 26 ES:
0CDF:002B 8F060202 POP [0202]
0CDF:002F FA CLI
0CDF:0030 26 ES:
0CDF:0031 C70624000402 MOV WORD PTR [0024],0204
0CDF:0037 26 ES:
0CDF:0038 C70626000000 MOV WORD PTR [0026],0000
0CDF:003E FB STI
0CDF:003F B8004C MOV AX,4C00
-g 0cdf:003f
AX=0000 BX=0000 CX=0000 DX=0000 SP=0080 BP=0000 SI=0073 DI=0233
DS=0CDF ES=0000 SS=0CD7 CS=0CDF IP=003F NV UP EI PL NZ NA PO NC
0CDF:003F B8004C MOV AX,4C00
-d 0:0
0000:0000 68 10 A7 00 BB 13 76 06-16 00 E6 03 B1 13 76 06 h.....v.......v.
0000:0010 8B 01 70 00 B9 06 27 02-40 07 27 02 FF 03 27 02 ..p...'.@.'...'.
0000:0020 46 07 27 02 04 02 00 00-3A 00 E6 03 54 00 E6 03 F.'.....:...T...
0000:0030 6E 00 E6 03 88 00 E6 03-A2 00 E6 03 FF 03 27 02 n.............'.
0000:0040 A9 08 27 02 A4 09 27 02-AA 09 27 02 5D 04 27 02 ..'...'...'.].'.
0000:0050 B0 09 27 02 0D 02 F6 02-C4 09 27 02 8B 05 27 02 ..'.......'...'.
0000:0060 0E 0C 27 02 14 0C 27 02-1F 0C 27 02 AD 06 27 02 ..'...'...'...'.
0000:0070 AD 06 27 02 A4 F0 00 F0-37 05 27 02 80 AF 00 C0 ..'.....7.'..... | | |