MegaCraZy6
@MegaCraZy6
Юзерь

Ассемблер как работает адресация в защищенном режиме?

Не могу понять некоторых моментов в коде код переходит в защищенный режим и выводит букву "А", очень нужна помощь.

Код:
use16
org 0x7c00
start:
  mov bx,pm_entry
  mov ax, 0x0003
  int 0x10
  in  al, 0x92
  or  al, 2
  out 0x92, al
  lgdt  [gdtr]
  cli                                 
  in  al, 0x70
  or  al, 0x80
  out 0x70, al
  mov  eax, cr0
  or   al, 1
  mov  cr0, eax
  jmp 00001000b:pm_entry
 

use32
pm_entry:
  mov  ax, cs
  mov  ds, ax
  mov  es, ax
 
  mov  edi, 0xB8000            
  mov  esi, msg                
  cld         
  mov al,'A'
  mov [edi],al

  jmp  $                  

gdt:
  db  0x00, 0x00, 0x00, 0x00, 0x00,      0x00,      0x00, 0x00
  db  0xFF, 0xFF, 0x00, 0x00, 0x00, 10011010b, 11001111b, 0x00
gdt_size  equ $ - gdt

gdtr:
  dw  gdt_size - 1
  dd  gdt
 
finish:
times 0x1FE-finish+start db 0
db   0x55, 0xAA


Можете подсказать на что указывает дескриптор, тоесть каков адрес начала сегмента который он определяет?
Я не могу понять именно как происходит этот прыжок

jmp 00001000b:pm_entry
use32
pm_entry:


Вся проблема в том что не понимаю я структуры дескриптора..
db  0xFF, 0xFF, 0x00, 0x00, 0x00, 10011010b, 11001111b, 0x00


PS: Можете просто по шагам об'яснить буду очень благодарен, кодить в реальном времени уже не-то. Я просто юзерь который полез в ассемблер не судите строго
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Вся проблема в том что не понимаю я структуры дескриптора..

https://en.wikipedia.org/wiki/Global_Descriptor_Table в чём сложность?

db 0xFF, 0xFF, 0x00, 0x00, 0x00, 10011010b, 11001111b, 0x00

Segment limit: 0xfffff
Base address: 0x00000000
Type: 0xa
S: 1
DPL: 0
P: 1
A: 0
DB: 1
G: 1
Т.е. этот сегмент действительный (P = 1), не системный (S = 1), начинается с адреса 0, покрывает 4Г, исполняемый и доступный для чтения (Type = 0xa), доступен из кольца защиты 0 (DPL = 0), не читанный (A = 0), со страничной гранулярностью (G = 1).

Я не могу понять именно как происходит этот прыжок
jmp 00001000b:pm_entry
use32
pm_entry:

В cs попадает 0x8, т.е. CPL = 0, использовать 1ю запись в GDT, в pc -- pm_entry.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы