王爽《汇编语言》第2版实验16的分析过程
问题的关键是:
找到子程序在中断例程中的入口地址
-r
AX=0000 BX=0000 CX=00F3 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13D3 ES=13D3 SS=13E3 CS=13E3 IP=0000 NV UP EI PL NZ NA PO NC
13E3:0000 8CC8 MOV AX,CS
-n sy16set.exe
-g28
AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=00F2 DI=02C5
DS=13E3 ES=0000 SS=13E3 CS=13E3 IP=0028 NV UP EI PL NZ NA PO NC
13E3:0028 B8004C MOV AX,4C00
-d13e3:0
13E3:0000 8C C8 8E D8 BE 2D 00 B8-00 00 8E C0 BF 00 02 B9 .....-..........
13E3:0010 C5 00 FC F3 A4 B8 00 00-8E C0 26 C7 06 F0 01 00 ..........&.....
13E3:0020 02 26 C7 06 F2 01 00 00-B8 00 4C CD 21 EB 08 59 .&........L.!..Y
13E3:0030 00 74 00 94 00 B8 00 50-53 80 FC 03 77 18 8A DC .t.....PS...w...
13E3:0040 B7 00 03 DB 81 C3 02 02-2E 8B 1F 81 C3 02 02 B9 ................
13E3:0050 2F 00 2B D9 FF D3 5B 58-CF 53 51 06 BB 00 B8 8E /.+...[X.SQ.....
13E3:0060 C3 BB 00 00 B9 D0 07 26-C6 07 20 83 C3 02 E2 F7 .......&.. .....
13E3:0070 07 59 5B C3 50 53 51 06-BB 00 B8 8E C3 BB 01 00 .Y[.PSQ.........
中断未安装时:
table在安装程序中的起始地址:002FH
子程序在安装程序中的起始地址:
sub1=13E3:002FH 占2个字节
sub2=13E3:0031H 占2个字节
sub3=13E3:0033H 占2个字节
sub4=13E3:0035H 占2个字节
子程序在安装程序中的入口地址:
(sub1)=0059H
(sub2)=0074H
(sub3)=0094H
(sub4)=00B8H
中断安装后,直接调用子程序的入口地址肯定是错误的.
关键就是如何找到子程序正确的入口地址?
我们来看一看安装中断例程后的情况:
-d0:200
0000:0200 EB 08 59 00 74 00 94 00-B8 00 50 53 80 FC 03 77 ..Y.t.....PS...w
0000:0210 18 8A DC B7 00 03 DB 81-C3 02 02 2E 8B 1F 81 C3 ................
0000:0220 02 02 B9 2F 00 2B D9 FF-D3 5B 58 CF 53 51 06 BB .../.+...[X.SQ..
0000:0230 00 B8 8E C3 BB 00 00 B9-D0 07 26 C6 07 20 83 C3 ..........&.. ..
0000:0240 02 E2 F7 07 59 5B C3 50-53 51 06 BB 00 B8 8E C3 ....Y[.PSQ......
0000:0250 BB 01 00 B9 D0 07 26 80-27 F8 26 08 07 83 C3 02 ......&.'.&.....
0000:0260 E2 F4 07 59 5B 58 C3 50-53 51 06 BB 00 B8 8E C3 ...Y[X.PSQ......
0000:0270 B1 04 D2 E0 BB 01 00 B9-D0 07 26 80 27 8F 26 08 ..........&.'.&.
table的起始地址发生了变化:
table在中断例程中的起始地址为:0000:0202H
子程序在中断例程中的起始地址:
sub1=0000:0202H 占2个字节
sub2=0000:0204H 占2个字节
sub3=0000:0206H 占2个字节
sub4=0000:0208H 占2个字节
子程序在中断例程中的入口地址:
(sub1)=0000:022CH
(sub2)=0000:0247H
(sub3)=0000:0267H
(sub4)=0000:028BH
以sub1为例:原来是0059H,现在是022CH
如何计算呢?
0059H+202H-002FH=022CH
其中:0059H是sub1未安装时的入口地址
202H是安装中断后,table的起始地址
002FH是安装中断前,table的起始地址
022CH是安装中断后,sub1的入口地址
其它三个子程序同理。 |