セグメントアドレスは多少複雑なメカニズムで作られますので、
順を追って説明します。
セグメントレジスタにはいくつかあります。CSはコードセグメント
レジスタで、マシン語命令を読み込む時に使われるものです。DSは
データセグメントレジスタで、マシン語命令に記述されたメモリアクセス
を行なう時に使われる物です。SSはスタックセグメントレジスタで、
マシン語のpushやpopの実行、ベースポインタ(BP)の操作に使われる
ものです。オフセットアドレスはマシン語命令の中に含まれる
アドレス値で、直接アドレッシングやベース相対アドレッシングなどの
アドレッシングに現われるものです。
セグメントレジスタにはセレクタ値が含まれています。
この値はセグメントディスクリプタテーブルの中にある
セグメントディスクリプタを示します。セグメントディスクリプタには
セグメントベースが記述されていますので、それをセグメント
アドレスとします。ディスクリプタテーブルには目的により
グローバルディスクリプタテーブル、ローカルディスクリプタテーブルが
ありります。グローバルディスクリプタテーブルは
システムに1つですが、ローカルディスクリプタテーブルはタスク毎に
持ちます。そして、これらのテーブルの位置を指し示しているのは
GDTRと LDTRです。これらのテーブルをどのように使うかはOSによって
違って来ます。
ハードウエア割り込みに限らず例外割り込みもその割り込み要因に 対応した割り込み番号が割り付けられています。リアルモードにおいては メモリ上に固定的にゼロ番地から1Kバイト分、割り込み番号と割り込みルーチンを 対応させる割り込みベクターテーブルがアサインされています。しかし、 プロテクトモードにおいては割り込みベクターテーブルの代わりに 割り込みディスクリプターテーブルを使います。IDTRはそのテーブルを 示しています。このレジスタの値はリアルモードでは0に固定されていましたが、 プロテクトモードではOSが値を自由に設定することができます。 割り込みディスクリプターテーブルの大きさは256個分です。
asm-i386/irq.h #define NR_IRQS 224 linux/include/asm/hw_irq.h: IDT vectors usable for external interrupt sources start at 0x20: #define FIRST_EXTERNAL_VECTOR 0x20 #define SYSCALL_VECTOR 0x80 Vectors 0x20-0x2f are used for ISA interrupts. Vectors 0xf0-0xfa are free (reserved for future Linux use). #define SPURIOUS_APIC_VECTOR 0xff #define ERROR_APIC_VECTOR 0xfe #define INVALIDATE_TLB_VECTOR 0xfd #define RESCHEDULE_VECTOR 0xfc #define CALL_FUNCTION_VECTOR 0xfb #define LOCAL_TIMER_VECTOR 0xef extern int irq_vector[NR_IRQS];
80386以降のCPU 論理アドレス空間 64TB 物理アドレス空間 4GB セグメントサイズ 4GB 486CPUのバス アドレスバス 32 bit データバス 32 bit I/O バス 16 bit 汎用レジスタ群 32 bit 16bit 8bit アキュムレータ EAX AX AH,AL ベースレジスタ EBX BX BH,BL カウンタレジスタ ECX CX CH,CL EDX DX DH,DL ソースインデックス ESI SI デスティネーションインデックス EDI DI ベースポインタ EBP BP スタックポインタ ESP SP インストラクションポインタ EPI PI フラグレジスタ EFLAGS FLAGS セグメントレジスタ コードセグメント CS データセグメント DS スタックセグメント SS エクストラセグメント ES FS GS *インストラクションポインタはいわゆるプログラムカウンタのこと システムレジスタ群 48 bit 32 bit 16 bit システムアドレスレジスタ グローバルディスクリプタテーブル GDTR 割り込みディスクリプタテーブル IDTR LDTR TR コントロールレジスタ CR0 CR1 CR2 CR3 GNUアセンブリ言語 表現規則の例題 movw %ax,%bx %axの内容を%bxに代入 movw $123,%ax 十進数123を%axに代入 movb $-0xa1,%cx 16進数-a1を%cxに代入 movb $0b10111101,%dh 2進数10111101を%dhに代入 movb $'A',%dl 文字'A'を%dlに代入 movl $var,%esi 変数varのアドレス値を%esiに代入 movb var,%ah 変数varのメモリの内容を%ahに代入 movb (%ebx),var %ebxが示すアドレスのメモリの内容を変数varに代入 x86のメモリアドレッシングモード イミーディエートアドレッシング mov $0x12, %al 16進数12を%alに代入 addl $0x89af,%ebx 16進数89afを%ebxの内容に加算 直接アドレッシング movb ($0x12),%al 16進数12のアドレスの内容をを%alに代入 movb 0x12,%al 上記と同じ movl var, %ebx 変数varの内容を%ebxに代入 間接アドレッシング movb (%bx),%al %bxが示すアドレスの内容を%alに代入 movb %cl,(%ebx) %clの内容を%ebxが示すアドレスに代入 ベース相対アドレッシング movb array(%bx),%al %bxの内容にarrayを加えた値をアドレスとし その内容を%alに代入 incw -10(%ebp) %ebpの内容に十進数-10を加えた値を アドレスとしてその内容をインクリメントする