Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Проблема инициализации GDT


Автор: Ant 30.10.2007, 15:48
Привет, народ! Есть код:

Код

org 7C00h

struc segment_descriptor limit_low, base_low, base_high0, type_and_permit, flags, base_high1
{
  .limit_low  dw ?
  .base_low   dw ?
  .base_high0 db ?
  .type_and_permit db ?
  .flags      db ?
  .base_high1 db ?
}

struc table_register  limit, base
{
  .limit      dw ?
  .base       dd ?
}

start:
    push    cs
    pop     ds

    call    open_A20
    call    disable_interrupts
    call    initialize_GDT
    call    set_pe

    mov     ax, 8                                           ;Вот эти строчки 
    mov     fs, ax                                          ;Вызывают перезагрузку процессора

  ;  mov     eax, 10000000
   ; mov     word [fs:eax], 1234h

  ;  mov     ax, 16
  ;  mov     ds, ax

  ;  xor     di, di
  ;  mov     si, message
  ;  mov     cx, message_l
  ;  rep     movsb
  ;  mov     ax, 0720h
  ;  mov     cx, rest_scr
  ;  rep     stosw

    q:
    jmp     q

ret

GDT:
    GDT0 segment_descriptor  <0,0,0,0,0,0>
    GDT_DATA  segment_descriptor <0ffffh, 0,0, 10010010b, 10001111b, 0>
    GDT_SCR segment_descriptor <4000, 0B800h, 0, 10010010b, 0, 0>
GDT_SIZE = $ - GDT

gdtr table_register  GDT_SIZE-1, 0

open_A20:
    in  al, 92h
    or  al, 2
    out 92h, al
    ret

initialize_GDT:
    call cs_to_eax
    add  eax, GDT0
    mov  [gdtr.base], eax
    lgdt [gdtr]
ret

disable_interrupts:
    cli
    in   al, 70h
    or   al, 80h
    out  70h, al
ret


set_pe:
    mov  eax, cr0
    or   al, 1
    mov  cr0, eax
ret

cs_to_eax:
    mov eax, 0
    mov ax, cs
    shl eax, 4
ret



message db 'H',1,'e',2,'l',3,'l',4,'o',5,',',6,' ',7,'w',8,'o',9,'r',10,'l',11,'d',12,'!',13
message_l = $ - message
rest_scr = (80*25) - (message_l / 2)

 


Я грешу на ошибки в GDT. Хотелось бы знать что не правильно?

Автор: Ant 30.10.2007, 18:04
Все, сам разобрался.. Вся ошибка заключалась в корявом заполнении регистра GDTR

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)