. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于第272页int9  [待解决] 回复[ 5次 ]   点击[ 501次 ]  
tiwen
[帖 主]   [ 发表时间: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的。
wdm
[第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,我们只要去看一下中断向量表中对应的数据不久全知道了。
tiwen
[第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.这样理解应该没问题了吧。
wdm
[第3楼]   [ 回复时间:2008-01-25 21:33 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
恩。楼上说的很有道理。我理解有偏差,我以为问的是call执行后cs的内容呢。没有去看程序,凭空分析的。呵呵。
看了一下书上的程序,确实,中断的时候,必然要去中断向量表中查找对应的中断例程的入口位置,而中断向量表是段地址为0的,所以,应该是中断例程在保存好当前cpu状态后就有相应指令修改了cs,ip的值,指向中断向量表中对应的位置了。
惭愧啊!
受教了!
taotling
[第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了。
taotling
[第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.'.....
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved