2017-09-18 9 views
0

8086マイクロプロセッサの割り込みベクタテーブルで、任意の割り込み(たとえばINT22HまたはINT15H)の物理アドレスを計算するにはどうすればよいですか?割り込みベクタテーブル内の任意の割り込み(例えばINT22HまたはINT15H)の物理アドレスを算出割込みベクタテーブルの割込みの物理アドレスを見つける方法は?

+0

あなたは、x86のドキュメントを読んでいましたか?あなたは16ビット、32ビット、または64ビットモードですか? http://osdev.org/&https://sites.google.com/site/masumzh/articles/x86-architecture-basics/interrupts-faults-and-trapsも参照してください。しかし、あなたの質問は広すぎてトピック外です(いくつか欠けている[MCVE](https://stackoverflow.com/help/mcve)) –

+0

私は16ビットモードです。 – user4983572

+0

リアルモード(16ビットモード)では、割り込みはメモリ内の16進数0000:0000から開始し、それぞれ4バイトを取るため、INT 15Hは16進数0000:0054の遠方ポインタになります。 INT 21h、AH = 35Hを使用してベクトルを取得し、AH = 25Hを使用してベクトルを設定することができます。 [wiki info](https://en.wikipedia.org/wiki/MS-DOS_API#DOS_INT_21h_services)を参照してください。 – rcgldr

答えて

1

...

  • 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] 
    
関連する問題