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?
- 5124 megtekintés
 
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
- A hozzászóláshoz be kell jelentkezni
 
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.
- A hozzászóláshoz be kell jelentkezni
 
tasm bp/bc kit-ben van.
- A hozzászóláshoz be kell jelentkezni
 
Mar sikerult NASM-mal megcsinalni, de koszi.
- A hozzászóláshoz be kell jelentkezni
 
Ne tartsd vissza :)
- A hozzászóláshoz be kell jelentkezni
 
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.
- A hozzászóláshoz be kell jelentkezni
 
UPDATE:
sikerult megtalalni a jo megoldast:
http://www.zeepedia.com/read.php?protected_mode_programming_vesa_linear…
- A hozzászóláshoz be kell jelentkezni
 
Kerdes: a CS es IP regiszterek azonnal erteket valtoztatnak, ahogy a cr0-ban megvaltoztatom a Proteted mode bitet?
- A hozzászóláshoz be kell jelentkezni
 
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...
- A hozzászóláshoz be kell jelentkezni
 
Sorry, hulyeseget irtam. Elfelejtettem, hogy van a jmp is a 'mov cr0, eax' utan.
- A hozzászóláshoz be kell jelentkezni