-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathentrypoint.s
More file actions
146 lines (115 loc) · 2.03 KB
/
Copy pathentrypoint.s
File metadata and controls
146 lines (115 loc) · 2.03 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
[ORG 0x00]
[BITS 16]
SECTION .text
START:
mov ax, 0x1000
mov ds, ax
mov es, ax
mov ax, 0x2401 ; A20 gate active
int 0x15 ; with BIOS interrupt service
jc .A20GATEERROR
jmp .A20GATESUCCESS
.A20GATEERROR:
in al, 0x92 ; read system control port
or al, 0x02 ; set A20 gate bit in 1
and al, 0xFE
out 0x92, al ; write system control port
.A20GATESUCCESS:
cli
lgdt [ GDTR ]
mov eax, 0x4000003B
mov cr0, eax
jmp dword 0x18: ( PROTECTEDMODE - $$ + 0x10000 )
[BITS 32]
PROTECTEDMODE:
mov ax, 0x20
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 0xFFFE
mov ebp, 0xFFFE
push ( SWITCHSUCCESSMESSAGE - $$ + 0x10000 )
push 2
push 0
call PRINTMESSAGE
add esp, 12
jmp dword 0x18: 0x10200 ; jump to starting point of C based kernel
PRINTMESSAGE:
push ebp
mov ebp, esp
push esi
push edi
push eax
push ecx
push edx
mov eax, dword [ ebp + 12 ]
mov esi, 160
mul esi
mov edi, eax
mov eax, dword [ ebp + 8 ]
mov esi, 2
mul esi
add edi, eax
mov esi, dword [ ebp + 16 ]
.MESSAGELOOP:
mov cl, byte [ esi ]
cmp cl, 0
je .MESSAGEEND
mov byte [ edi + 0xB8000 ], cl
add esi, 1
add edi, 2
jmp .MESSAGELOOP
.MESSAGEEND:
pop edx
pop ecx
pop eax
pop edi
pop esi
pop ebp
ret
align 8, db 0
dw 0x0000
GDTR:
dw GDTEND - GDT - 1
dd ( GDT - $$ + 0x10000 )
GDT:
NULLDescriptor:
dw 0x0000
dw 0x0000
db 0x00
db 0x00
db 0x00
db 0x00
IA_32eCODEDESCRIPTOR:
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xAF
db 0x00
IA_32eDATADESCRIPTOR:
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xAF
db 0x00
CODEDESCRIPTOR:
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00
DATADESCRIPTOR:
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00
GDTEND:
SWITCHSUCCESSMESSAGE: db 'Switch Success', 0
times 512 - ( $ - $$ ) db 0x00