Dosbox + NASM + Protected mode

Sziasztok!

Ossze szeretnek dobni egy programot assembly-ben, ami atkapcsol vedett modba, ott tokol egy kicsit, majd visszalep.
Ehhez telepitettem a dosboxot, nasm-ot (ami jol mukodik).
Ezutan elkezdtem peldakodokat bongeszni, de egyik sem mukodott.
Lefordultak ezzel az utasitassal:

nasm -f bin first.asm -o first.com

Aztan amikor elinditottam, akkor kilepett a dosbox, ennyit mondva:

Aborted (core dumped)
A Dump file-t nem talaltam meg.

Valaki meg tudna dobni egy jol mukodo nasm-ban fordulo koddal, ami atkapcsol vedett modba?

Hozzászólások

Nem lehet, hogy a virtuális x86 módban nem lehet védett módú utasítást végrehajtani?

Szerk.:

"DOSBox is a full CPU emulator, capable of running DOS programs that require the CPU to be in either real mode or protected mode." -- Wikipedia

Ezek szerint nem ez lesz a gond.

Fuszenecker_Róbert

Igen, ezt en is megneztem.
Azon csodalkoztam, hogy a nasm siman megette a linuxos sorvegeket dos-ban. De szerintem ez nem a hiba oka.
Most elkezdtem apro lepesekben felepiteni a programot, hatha megtalalom a hiba helyet.

A masik problema, hogy TASM-ot (amihez van szakkonyvem es forraskodom) nem tudok feltenni a dosboxra. Egyetlen telepitot talaltam hozza, de az windows-os rendszerfile-okat kert.

Szoval:

ugy tunik, sikerul atkapcsolni vedett modba, viszont a GDT-t rosszul toltom ki, ezert random helyen folytatodik a vegrehajtas.

Legalabbis abbol gondolom ezt, hogy rendre a

Exit to error: Illegal descriptor type 0 for int 0

hibaval hal meg a dosbox. Marpedig en annyi kodot irtam a 32bites szegmensbe, hogy nop-oljon a vegtelensegig.

A GDT-m:

section .data

NULL_DESC:
dd 0
dd 0
CODE_DESC:
dw 0xFFFF
dw 0
db 0
db 10011010b
db 11001111b
db 0
DATA_DESC:
dw 0xFFFF
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdtr:
Limit dw 24
Base dd NULL_DESC

A kodszegmensben, mielott atbillentem cr0-t:

cli
push cs
pop ds

xor eax, eax
mov ax, ds
shl eax, 4
add [gdtr + 2], eax ; beallitjuk a gdtr-ben GDT cimet
mov cx, 3 ; ez a GDT tabla merete

; itt pedig a szegmensek cimet alitjuk be a GDT-ben:
mov edx, gdtr
add edx, 8
mov bx, ax
shr eax, 16
gdtloop:
add [edx+2], bx
add [edx+4], al
add [edx+7], ah
add edx, 8
loop gdtloop
lgdt [gdtr]

mov eax, cr0
or al, 1
mov cr0, eax

jmp 0x08:pmode_jmp

bits 32
pmode_jmp:

mov ecx, 2
infloop:
nop
jmp infloop

A Horvath Gabor-fele Assembly vedett modu programozas c. konyvet hasznalom, meg netrol szedett peldakat.