pavia писал(а):
1) Как инициируешь GDTR? И GDT?
Код:
;Set up GDT
mov si,GDT
add si,bp
mov di,GDT_OFFSET
mov cx,GDT_ENTRIES<<2
rep movsw
;skipped
lgdt [GDT_OFFSET]
pavia писал(а):
2)
Тут ошибка, не учитывается переполнение.
Код:
mov word[SYS_DATA+PDESCR+base_l],((DATASG<<4)&0fff0h)+IDT_OFFSET
mov word[SYS_DATA+PDESCR+base_m],(DATASG>>12)
Можешь проверит при DSEG=9b00h и IDT_OFFSET=5000h
Надо
((DATASG<<4)+IDT_OFFSET)&0ffffh
((DATASG<<4)+IDT_OFFSET)>>16
C GDTR тоже самое скорее всего.
Спасибо, исправил... Только вот GDT располагается намного раньше 0xFFFF - так что не думаю, что эта ошибка была критичной...
Код:
INT_OFFSET equ 8h
INT_SIZE equ 4*100h
IDT_OFFSET equ INT_OFFSET+INT_SIZE
%ifdef USE_X64
IDT_SIZE equ 16*100h
%else
IDT_SIZE equ 8*100h
%endif
GDT_OFFSET equ IDT_OFFSET+IDT_SIZE
GDT_NULL equ 0
GDT_STCK equ 1 ;08h
GDT_CODE equ 2 ;10h
GDT_DATA equ 3 ;18h
GDT_SCRN equ 4 ;20h
;skipped
FLAGS_CS equ 10011010b ;9ah ;P|DPL|11|C|R|A
FLAGS_DS equ 10010010b ;92h ;P|DPL|10|E|W|A
FLAGS_US equ FLAGS_CS|(RPL<<5) ;11111010b ;0fah
FLAGS_ES equ FLAGS_DS|(RPL<<5) ;11110010b ;0f2h
;skipped
;структура для описания дескрипторов сегментов
struc descr
limit resw 1 ;00h Граница, биты 0..15
base_l resw 1 ;02h база, биты 0..15
base_m resb 1 ;04h база, биты 16..23
attr_1 resb 1 ;05h байт аттрибутов 1 ;P|DPL|S|TYPE
attr_2 resb 1 ;06h байт аттрибутов 2 ;G|D/B/X|L|AVL|LIM16-19
base_h resb 1 ;07h база, биты 24..31
endstruc
;pdescr istruc descr
; iend
;GDT
GDT istruc descr ;00h
; at limit, dw GDT_SIZE-1
at limit, dw 0xFFFF
at base_l, dw ((DATASG<<4)&0xFFFF)+GDT_OFFSET
at base_m, db (DATASG>>12)
iend
gdt_stck istruc descr ;08h
at limit, dw 0xFFFF
at base_l, dw (STCKSG<<4)&0xFFFF
at base_m, db (STCKSG>>12)
at attr_1, db FLAGS_DS ;P|DPL|0|TYPE
; at attr_2, db 0 ;G|X|0|AVL|LIMIT
iend
gdt_code istruc descr ;10h
at limit, dw code_size-1
at base_l, dw (CODESG<<4)&0xFFFF
at base_m, db (CODESG>>12)
at attr_1, db FLAGS_CS ;P|DPL|11|C|R|A
; at attr_2, db 0 ;G|D|L|AVL|LIMIT
iend
gdt_data istruc descr ;18h
at limit, dw 0FFFFh ;data_size-1
at base_l, dw (DATASG<<4)&0xFFFF
at base_m, db (DATASG>>12)
at attr_1, db FLAGS_DS ;P|DPL|10|E|W|A
; at attr_2, db 0 ;G|B|0|AVL|LIMIT
iend
gdt_scrn istruc descr ;20h
%ifdef USE_VESA
at limit, dw 0xFFFF
at base_l, dw (VESASG<<4)&0xFFFF
at base_m, db (VESASG>>12)
%else
at limit, dw 0xFFF
at base_l, dw (SCRNSG<<4)&0xFFFF
at base_m, db (SCRNSG>>12)
%endif
at attr_1, db FLAGS_ES
at attr_2, db 11011111b ;G|X|0|AVL|LIMIT
;%ifdef USE_LFB
; at limit, dw 0xFFFF
; at base_l, dw (FLATSG<<4)&0xFFFF
; at base_m, db (FLATSG>>12)
; at base_h, db (FLATSG>>16)
; at attr_1, db FLAGS_DS
;%endif
iend
pavia писал(а):
3) Я таки не понял у вас код для 286 который не мог адресовать больше 16 МБайт. Как вы с LFB собрались работать не понятно!
Почему код в p_mode: 16 битный?
А вот это особый момент... Изначально, чисто ради интереса, я стал писать под 80286 (ибо их у меня аж ДВА штуки)))
И теперь код по большей части так и остался 16-битным... Переделать на 32/64-бит пока не получилось... Хотя TSS 32-битные...
Кстати, вопрос: в NASM достаточно использовать директиву BITS ?
И еще есть проблема при переделывании на 32/64 - я так понимаю надо заменить всё 16-битные команды 32-битными? Верно?
Ибо у меня сразу всё виснет, а bochs ругается мол неверный префикс LOCK итп
НО! В bochs ведь работает!
Код:
00163568000i[CPU0 ] | IOPL=3 ID vip vif ac vm rf NT of df IF tf sf zf af PF cf
00163568000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D
00163568000i[CPU0 ] | CS:0010( 0002| 0| 0) 00020000 0000ffff 0 0
00163568000i[CPU0 ] | DS:0038( 0007| 0| 0) 01000000 5fffffff 1 0
00163568000i[CPU0 ] | SS:0008( 0001| 0| 0) 00060000 0000ffff 0 0
00163568000i[CPU0 ] | ES:0038( 0007| 0| 0) 01000000 5fffffff 1 0
00163568000i[CPU0 ] | FS:0050( 000a| 0| 0) 00000000 ffffffff 1 1
00163568000i[CPU0 ] | GS:0020( 0004| 0| 0) e0000000 00ffffff 1 0
pavia писал(а):
Цитата:
jmp GDT_CODE<<3:p_mode
В дизассемблере инструкцию проверяли правильно генерируется или нет?
да, там всё ок...
Код:
0000037E 0F01E0 smsw ax
00000381 83C801 or ax,byte +0x1
00000384 0F01F0 lmsw ax
00000387 EA8C031000 jmp word 0x10:0x38c
0000038C B82000 mov ax,0x20