Пытаюсь освоить DPMI. Выделил селекторы для кода и для данных, установил для них базы и максимальный лимит (4Гб); вошел в защищенный режим. Вопросы: 1. Каким образом нужно инициализировать stack? (например, хочется stack размером в 1М). 2. Если у меня есть селектор для данных ds (насколько я понимаю, внутри этого селектора можно адресовать 4Гб памяти), как внутри этого селектора динамически выделять и освобождать память? (Например, если в винде вызываю LocalAlloc(LMEM_FIXED...), то могу обращаться к памяти непосредственно через возвращенный указатель; сегментные регистры при этом не меняются, т.е. выделенный блок адресуется тем же селектором). Есть ли в DPMI функции, которые делают что-то подобное? Функция DPMI 0501 выделяет блок памяти, но, насколько я понял, для него нужно создавать отдельный селектор. Или может можно выделенный этой функцией блок привязать к уже существующему селектору (ds)?
format MZ heap 0 segment RMode use16 ;============================================== mov ax,1687h ; Âêëþ÷àåì DPMI-(es:di-âõîä â ProtectMode int 2Fh ; âûõîä:si=3 (çíà÷èò 48 byte äëÿ XP push es di ax ; ax=0,es:di- êëàäåì â ñòåê äëÿ ïåðåõîäà mov ax,PMode ; mov ds,ax ; shl eax,4 ; or dword [ds:GDTCS+2],eax ; or dword [ds:GDTDS+2],eax ; pop es ; es=0 mov ax, 1 ; pm32 call dword ptr esp ; ïåðåõîäèì es:di jc $ ; âèñèì åíñëè íå ïåðåøëè ;==========================================; ; Èíèöèàëèçàöèÿ ñåãìåíòîâ ; ;==========================================; push ds ; pop es ; mov dx,2 ; mov edi,GDTDS ; mov cx,1 ; @@: xor ax,ax ; int 31h ; jc $ ; push ax ; mov bx,ax ; mov ax,000Ch ; int 31h ; jc $ ; mov edi,GDTCS ; dec dx ; jnz @b ; push PM_entry ; retf ; jmp $ ; ;==========================================; ; segment PMode use32 ; áàçà CSS:ES:SS=P;Mode ; âñå ëèìèòû - 4 Ãá ; PM_entry: ; pop ax ; mov ds,ax ; mov es,ax ; mov ss,ax ; mov esp,PMstack ; è óñòàíîâè;òü ñòåê ; mov ax,'1';---------------- ; int 29h ; me_test ; int 16h;------------------- ; mov ah,4Ch ; âûõîäèì int 21h ; ; GDTCS dd 0x0000FFFF,0x00CFFA00 ; Code GDTDS dd 0x0000FFFF,0x00CFF200 ; Date PMstack:segment RMstack use16 db 1024 dup (?) ; ñòåê 3 ïàðàãðàôà -íàâñÿêèé
Блин язык(( db 1024 dup (?) ; размер стека для тебя db 1024*1024 dup (?) 2Fh ax:1687h вкл. DPMI 31h ax:0x0000 создать дескриптор 31h ax:0x000C загрузить ;GDTCS (Code),GDTDS(Date) должны быть настроены
ОПС прости не дочитал до динамически. INT 31h, АХ = 0500h — Получить информацию о свободной памяти INT 31h, AX = 0501h — Выделить блок памяти INT 31h, АХ = 0502h — Освободить блок памяти INT 31h, AX = 0503h — Изменить размер блока памяти
INT 31h, AX = 0501h ВХ:СХ = размер блока в байтах, больше нуля Вывод: если CF = 0, ВХ:СХ = линейный адрес блока; SII = идентификатор блока для функций 0502 и 0503 функция сама берет на себя твои заморочки