Fórumok
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.
tasm bp/bc kit-ben van.
Mar sikerult NASM-mal megcsinalni, de koszi.
Ne tartsd vissza :)
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.
UPDATE:
sikerult megtalalni a jo megoldast:
http://www.zeepedia.com/read.php?protected_mode_programming_vesa_linear…
Kerdes: a CS es IP regiszterek azonnal erteket valtoztatnak, ahogy a cr0-ban megvaltoztatom a Proteted mode bitet?
Tudomásom szerint nem, a következő utasításnál folytatja, viszont védett módba váltás előtt már nem árt, ha be vannak állítva a szükséges dolgok...
Sorry, hulyeseget irtam. Elfelejtettem, hogy van a jmp is a 'mov cr0, eax' utan.