2
%macro Descriptor 3
dw  %2 & 0FFFFh             
dw  %1 & 0FFFFh             
db  (%1 >> 16) & 0FFh           
dw  ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) 
db  (%1 >> 24) & 0FFh           
%endmacro ; 

LABEL_DESC_DATA:   Descriptor    0,   DataLen-1, 92h 

上記が定義です。

その初期化に関する質問は次のとおりです。

xor eax, eax                           
mov ax, ds                              
shl eax, 4                              
add eax, LABEL_DATA                     
mov word [LABEL_DESC_DATA + 2], ax      ;what happens in this instruction?
shr eax, 16
mov byte [LABEL_DESC_DATA + 4], al
mov byte [LABEL_DESC_DATA + 7], ah
4

1 に答える 1

1

このマクロは、グローバル記述子テーブル エントリ (つまり、セグメント記述子) を初期化します。x86 アーキテクチャの歴史により、これらの記述子にはいくつかの部分に分割されたいくつかのフィールドがあります。

ここに画像の説明を入力
( OS Dev wikiからの写真)

マクロは、base、limit、および access の値を取得し、8 バイト エントリの対応する場所に配置します。

コード フラグメントBaseは、記述子のフィールドを実行時の値に初期化します。は線形アドレスでなければならないためBase、式を使用して最初にそのアドレスを計算しますlinaddr = segment<<4 + offset(リアル モードで有効)。

詳細については、OS Dev wiki:セグメンテーションGDTを参照してください。

于 2013-06-18T15:30:07.747 に答える