Переключение в защищенный режим из DOS без использования DPMI - PullRequest
0 голосов
/ 13 февраля 2019

Я изучил сборку x86-16 и хочу научиться сборке x86-32.Я сделал простую 32-битную программу, но этот код не работает. Когда программа делает далеко прыжок, консоль отображает «JMP незаконный дескриптор 0», я использую fasm и DOS. Пожалуйста, покажите мне, что я делаю плохо

Вот мой код

format MZ

push cs
pop ds
mov eax,cs
shl eax,4
mov [AdresSegmentuProgramu_32],eax ;Calculating real mode segment
add eax,gdt_table
mov [gdtr+2],eax
use32
lgdt [gdtr]


mov eax,[AdresSegmentuProgramu_32]
add eax,pmode_entry
mov [AdresSegmentu_PMODE_entry],eax

mov eax,cr0
or eax,1    ;Switch to PMODE
mov cr0,eax

mov eax,[AdresSegmentu_PMODE_entry] ;Far jump to reset CS and jump to simple code
mov [far_jump],eax


jmp far [ds:far_jump]

far_jump:
dd 0
dw 08h ; Selector 0x08

gdtr: dw 128
dd 0


AdresSegmentuProgramu_32 dd 0
AdresSegmentu_PMODE_entry dd 0

use32

gdt_table:
dq 0
code_descriptor:
dw 0ffffh
dw 0
db 0
db 09ah
db 11001111b
db 0
data_descriptor:
dw 0ffffh
dw 0
db 0
db 092h
db 11001111b
db 0

dq 0
dq 0

pmode_entry:

mov esi,0b8000h
mov byte [esi],'a'

1 Ответ

0 голосов
/ 14 февраля 2019

После установки PE (бит 0 CR0) процессор работает в 16-битном защищенном режиме.Дальний переход к сегменту 32-битного кода - это шаг, который заставляет процессор начать выполнение в 32-битном режиме.Таким образом, инструкция дальнего перехода в этом коде выполняется в 16-битном режиме и по умолчанию использует 16-битный операнд.

Применение атрибута fword к операнду инструкции, как советовал Майкл, заставляет ассемблер помещатьпрефикс размера операнда в инструкции дальнего перехода, изменяя размер операнда для этой команды на 32 бита.

Другая альтернатива - изменить dd на метке far_jump на dw и продолжать использовать16-битная инструкция дальнего перехода, но только если вы знаете, что 32-битная точка входа находится в пределах первых 64 КБ памяти.Поскольку BIOS загружает загрузочный сектор на 7c00, это обычно так.

...