PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| jmp short _start %define Code 10011011b ;Toegangsrechten Code segment %define Data 10010011b ;Toegangsrechten Data segment ;Selectors %define Programma 0x08 ;Wijst naar het programma %define Opslag 0x10 ;Wijst naar de data opslag %define BeeldScherm 0x18 ;Wijst naar het beeldscherm %macro Descriptor 5 dw %3 ;Limiet dw %2 ;Basis Minst Significant db %1 ;Basis Meest Significant db %4 ;Toegangsrechten db %5 ;Hoogste nibble granulitiet laagste nible Limiet db 0 ;Basis %endmacro ;-------------------------------------- ;Nog in Real MODE ;-------------------------------------- bits 16 _start: mov ax, 0xb800 mov es, ax ;ES wijst naar video geheugen mov al,'R' ;Zet een R op het scherm in Real mode mov ah,10000111b ;Geef R in het wit en knipperend weer mov word [es:0x2], ax ;Zet R plus attribuut in video geheugen cli ;Zet Interrupts uit lgdt[gdtr] ;laad Gdt mov eax, cr0 or al,0x01 ;Zet PM bit mov cr0,eax jmp Programma:PM_start ;HIER GAAT HET FOUT ;-------------------------------- ;Protected MODE ;-------------------------------- bits 32 PM_start: mov ax,Opslag mov ds, ax mov es, ax mov ax, BeeldScherm mov gs, ax mov word[gs:0], 0x741 ;Zet in PM een witte A op het scherm spin : jmp spin PM_eind: bits 16 gdtr: dw gdt_eind-gdt-1 ;Limiet dd gdt ;Basis gdt Descriptor 0,0,0,0,0 ; Null descriptor Descriptor 0, 0, 0x0ffff , Code, 0x0cf ;Programma code 08h Descriptor 0,0, 0x0ffff, Data, 0xcf ;Data Opslag 10h Descriptor 0x0b, 0x8000, 0x4000, Data, 0x00 ; Scherm 18h gdt_eind |
Ben al een tijdje bezig met wat low-level programmeren en het leek me erg leuk zelf de protected mode eens in te gaan(ivm 4gb geheugen en multitasking). Heb dus assembler code van het net gehaald die ervoor zorgt dat het bestand PM.bin(bovenstaande code) van schijf in het geheugen geladen wordt bij booten.
Nu is het volgende een probleem. Ik heb het internet eens afgestruind en in een aantal assembler boeken gekeken en ze hebben het er allemaal over dat als de GDT eenmaal in orde is, het een kwestie is van PM bit zetten en een far jump uitvoeren om in de protected mode te komen.
Nu is bovenstaande code volgens mij dik in orde. Niks is echter minder waar, want als ik de code uitvoer is het enige wat de computer doet rebooten.
Nu wil ik jullie vragen wat doe ik fout.
offtopic:
Even voor de duidelijkheid, bovenstaande is dus geen php
, maar hij gaf hem op deze manier het mooist weer
Even voor de duidelijkheid, bovenstaande is dus geen php