объяснение кода сборки - PullRequest
2 голосов
/ 27 октября 2010

Может кто-нибудь объяснить мне этот кусок ассемблерного кода?

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

Здесь я уже погуглил по поводу команд equ, dw и db, но не могу понять, что этот код на самом деле делает (особенно первыйлиния).что это за $ -gdt и параметры dw и db?Пожалуйста, объясните подробно, если это возможно.Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 27 октября 2010

На самом деле это 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. Базовый адрес рассчитывается по f,Поля c и b, от наиболее значимых к наименьшим - поскольку все они равны нулю, база равна нулю.

  2. Предел селектора вычисляется из самых правых 4 битовe и все a, чтобы дать 0xfffff в этом случае.К этому добавили 1, чтобы дать 0x100000.См. Пункт 3 ниже, чтобы узнать, что это значит.

  3. Старшие 4 бита e (флаги) устанавливают гранулярность (4 КБ, а не 1 байт) и размер операнда (32-немного).С гранулярностью 4K (12 бит) и количеством страниц 0x100000 (20 бит) это дает вам ваше полное 32-битное (4G) адресное пространство.

  4. d поле является байтом доступа и устанавливает следующие свойства на основе 0x92:

    • Pr текущий (в памяти) бит в значение true.
    • Privl уровень привилегийдо 0 (для получения доступа необходимо набрать 0).
    • Ex исполняемый бит 0 (селектор данных).
    • DC, бит направления равен 0, сегмент увеличивается.
    • RW из 1, память доступна для записи.
    • Ac бит доступа установлен на 0.
3 голосов
/ 27 октября 2010

db/dw означает слово данных / байт данных.Это некоторые данные, без контекста это может означать что угодно, поэтому есть некоторые комментарии.equ означает равный, он используется для хранения констант.Я предполагаю, что gdt определяется где-то еще как адрес / указатель на Глобальную таблицу дескрипторов .

. Здесь есть учебник GDT , который использует те же самые константы длявызов функции:

/* 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);
2 голосов
/ 27 октября 2010

http://en.wikibooks.org/wiki/X86_Assembly/Global_Descriptor_Table#GDT

dw и db - это «определение слова» и «определение байта» соответственно, но НЕ «определение» в смысле c-стиля. Они выделяют в памяти место размером слова и байта (слово зависит от архитектуры, байт 8 бит).

...