bits 32 global gdt_flush gdt_flush: ; Берем адрес gdtp, переданный как аргумент функции (лежит в стеке) mov eax, [esp + 4] lgdt [eax] ; Загружаем новую GDT ; Обновляем сегменты данных. 0x10 — это смещение Kernel Data в нашей GDT (индекс 2 * 8 = 16 = 0x10) mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax ; Делаем дальний прыжок, чтобы обновить регистр CS. ; 0x08 — это смещение Kernel Code (индекс 1 * 8 = 8 = 0x08). ; Процессор прыгнет на метку .flush, но уже с новым селектором CS. jmp 0x08:.flush .flush: ret