【问题标题】:How to find the physical address of interrupts in interrupt vector table?如何在中断向量表中找到中断的物理地址?
【发布时间】:2017-09-18 05:56:30
【问题描述】:

如何在 8086 微处理器的中断向量表中计算任何给定中断(例如 INT22H 或 INT15H)的物理地址?

【问题讨论】:

  • 您阅读过 x86 的文档吗?你是 16 位、32 位还是 64 位模式?另请参阅osdev.org 和sites.google.com/site/masumzh/articles/x86-architecture-basics/…,但您的问题过于宽泛且离题(缺少一些MCVE)
  • 我处于 16 位模式。
  • 在实模式(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 内存中的任何位置。 (在 上没有超过 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]
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2017-10-29
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    相关资源
    最近更新 更多