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
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 ?