Привет, народ! Есть код:
| Код | 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. Хотелось бы знать что не правильно? |