przejście w 32bit PMode

0

Potrzebuje działającego 16b kodu który umożliwiłby mi przejście w 32b PMode. Warunkiem jest brak użycia zewnętrznych procedur itp. Zależy mi na stworzeniu globalnej tablicy deskryptorów itp.

0

Przechodzi w protected mode i dodatkowo wypisuje "Hello World!" Kod nie jest mój, ale nie mogę znaleźć adresu z którego to wziąłem więc wklejam w całości.

.386p

STACK_SIZE	equ 4096

;------------------------------------------------------------
;	16-bit code
;------------------------------------------------------------

code16 segment para public use16
	assume cs:code16, ds:code32

start16:
	mov	ax, code32
	mov	ds, ax

	mov	eax, cr0
	test	eax, 1
	je	v86_detected
	jmp	mode_ok

v86_detected:
	mov	ah, 4ch
	mov	al, 1
	int	21h

mode_ok:
	mov	eax, code32
	shl	eax, 4
	mov	small dword ptr [code32_base], eax

	mov	ebx, eax
	shr	ebx, 16

	mov	di, small offset desc_code32
	mov	word ptr [di + 2], ax
	mov	byte ptr [di + 4], bl
	mov	byte ptr [di + 7], bh

	mov	di, small offset desc_data32
	mov	word ptr [di + 2], ax
	mov	byte ptr [di + 4], bl
	mov	byte ptr [di + 7], bh

	mov	eax, offset desc_null
	add	eax, small dword ptr [code32_base]
	mov	small dword ptr [gdt_reg + 0], eax

	mov	small word ptr [gdt_reg + 4], 3 * 8

	lgdt	small fword ptr [gdt_reg]

	cli

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

	push	8
	push	large offset start32
	retf

code16 ends

;------------------------------------------------------------
;	32-bit code
;------------------------------------------------------------

code32 segment para public use32
	assume cs:code32, ds:code32

desc_null	db 0, 0, 0, 0, 0, 0, 0, 0
desc_code32	db 0ffh, 0ffh, 0h, 0h, 0h, 10011010b, 11001111b, 0h
desc_data32	db 0ffh, 0ffh, 0h, 0h, 0h, 10010010b, 11001111b, 0h

gdt_reg		dd 0
		dw 0

txt_hello	db 'Hello World!'
TXT_HELLO_LEN	equ $ - txt_hello

start32:
	mov	ax, 16
	mov	ds, ax
	mov	es, ax
	mov	ss, ax

	mov	esp, stack_seg
	sub	esp, large code32
	shl	esp, 4
	add	esp, STACK_SIZE - 4

	mov	esi, offset txt_hello
	mov	edi, 0b8000h
	sub	edi, dword ptr [code32_base]
	mov	ecx, TXT_HELLO_LEN
	mov	ah, 14
txt_print:
	lodsb
	stosw
	loop	txt_print

hang_me:
	jmp	hang_me

code32 ends

;------------------------------------------------------------

stack_seg segment para stack 'stack'
	db STACK_SIZE dup(?)
stack_seg ends

end start16


0

Pomimo poprawienia tego kodu i tak nie udało mi się go poprawnie uruchomić. Pamiętaj żeby nie kopiować czyjegoś kodu chyba że sam sprawdziłeś jego poprawność działania.

Ponawiam swoje zapytanie - Czy ktoś wie jak poprawnie przejść w 32PMode.

0

No cóz mi się udało... Tutaj masz link do tego artykułu http://www.ps.nq.pl/main.php?dzial=asembler&kategoria=artykuly&id=4

0

Ten program u mnie resetuje komputer. Wie ktoś dlaczego ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1