2010-10-27 115 views
2

任何人都可以解釋我這段彙編代碼嗎?彙編代碼的解釋

LINEAR_DATA_SEL equ $-gdt 
    dw 0FFFFh 
    dw 0 
    db 0 
    db 92h  ; present, ring 0, data, expand-up, writable 
    db 0CFh  ; page-granular (4 gig limit), 32-bit 
    db 0 

這裏我已經google了關於命令equ,dw和db,但我不明白這段代碼實際做了什麼(特別是第一行)。這個$ -gdt和dw和db的參數是什麼?請儘可能詳細解釋。提前致謝。

+1

我敢肯定這是不是代碼在所有,但定義數據。它設置符號LINEAR_DATA_SEL,然後定義它後面的一些字和字節數據。我不確定-gdt位(這就是爲什麼我沒有輸入這個答案)。 – 2010-10-27 16:46:46

回答

7

它實際上是全局描述符表中的一個8字節條目。它創建一個描述符作爲選擇器來處理整個4G​​地址空間。

equ $-gdt在彙編器中設置的值等於該位置($)和gdt標籤之間的差值。換句話說,這是GDT本身內的這個條目的偏移量。

一個GDT條目的結構是如下所示:

          alt text

其中各個部件進行說明。

          alt text

爲了您的具體數值,

(a) dw FFFFh 
(b) dw 0 
(c) db 0 
(d) db 92h  ; present, ring 0, data, expand-up, writable 
(e) db CFh  ; page-granular (4 gig limit), 32-bit 
(f) db 0 
  1. 基址從fcb場計算,從最顯著到最低 - 因爲這些都是零,基數爲零。

  2. 選擇限制是從e的最右邊4位和所有a計算得出的,在這種情況下給出0xfffff。這已添加到它給0x100000。關於這意味着什麼,請參見下面的第3點

  3. e(標誌)的前4位設置粒度(4K而不是1字節)和操作數大小(32位)。採用4K(12位)和頁數爲0x100000(20位)的粒度,可爲您提供完整的32位(4G)地址空間。

  4. d字段是接入字節並且基於0x92以下屬性:

    • Pr本(存儲器)位爲true。
    • Privl privelege level to 0(需要響0才能獲得訪問權限)。
    • Ex可執行位0(數據選擇器)。
    • DC,方向位爲0,段長大。
    • RW的1,內存是可寫的。
    • Ac訪問位設置爲
+0

我覺得我錯過了通過計算機架構課程睡覺的東西:) – 2010-10-27 18:44:04

3

db/dw表示數據字/數據字節。這是一些數據,沒有上下文可能意味着什麼,這就是爲什麼有一些評論。 equ表示相等,用於存儲常量。我猜gdt被定義爲/ Global Descriptor Table的指針的地址。

這裏有一個GDT tutorial使用相同的常數函數調用:分別但不是

/* Setup a descriptor in the Global Descriptor Table */ 
void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) 

[...] 

/* The third entry is our Data Segment. It's EXACTLY the 
* same as our code segment, but the descriptor type in 
* this entry's access byte says it's a Data Segment */ 
gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);