【问题标题】:How to find the physical address of interrupts in interrupt vector table?如何在中断向量表中找到中断的物理地址?
【发布时间】:2017-09-18 05:56:30
【问题描述】:
如何在 8086 微处理器的中断向量表中计算任何给定中断(例如 INT22H 或 INT15H)的物理地址?
【问题讨论】:
-
-
-
在实模式(16 位模式)中,中断从内存中的十六进制 0000:0000 开始,每个占用 4 个字节,因此 INT 15H 将是十六进制 0000:0054 处的远指针。您可以使用 INT 21h, AH = 35H 获取向量,使用 AH = 25H 设置向量。见wiki info。
标签:
x86-16
microprocessors
【解决方案1】:
...计算中断向量表中任何给定中断(例如INT22H或INT15H)的物理地址...
-
int 15h 指令找到它应该call 的远指针的物理地址。
这是中断向量表内的偏移量,因此给出了列表 {0,4,8,12, ... , 1016,1020} 中的物理地址,也就是线性地址。
由于每个向量都是 4 字节长,因此只需将中断号乘以 4。
mov ax,0415h ;AL=Interrupt number, AH=4
mul ah ; -> Product in AX
cwd ;(*) -> Result in DX:AX=[0,1023]
(*) 我喜欢所有以 DX:AX 表示的线性地址。这就是我使用看似不必要的cwd 指令的原因。
-
最终处理int 15h 的物理地址。
这可以是 1MB 内存中的任何位置。 (在8086 上没有超过 1MB 的内存)。
每个 4 字节向量由一个偏移字和一个段字组成。顺序很重要。
线性地址由段值乘以 16 并加上偏移值计算得出。
mov ax,16
mul word ptr [0015h * 4 + 2] ;Segment in high word -> Product in DX:AX
add ax, [0015h * 4] ;Offset in low word
adc dx, 0 ; -> Result in DX:AX=[0,1048575]