1// Zero memory for page directories and page tables
2mov $0x1000,%edi
3mov $0x1000,%ecx
4xor %eax,%eax
5rep stos %eax,(%edi)
6
7// Load DWORD [0x4000] with 0xDEADBEEF to retrieve later
8mov $0x4000,%edi
9mov $0xBEEF,%eax
10mov %eax, (%edi)
11
12// Identify map the first 4MiB of memory
13mov $0x400,%ecx
14mov $0x2000,%edi
15mov $3, %eax
16loop:
17stos %eax,(%edi)
18add $0x1000,%eax
19loop loop
20
21// Map phyiscal address 0x4000 to cirtual address 0x7FF000
22mov $0x3ffc,%edi
23mov $0x4003,%eax
24mov %eax, (%edi)
25
26// Add page tables into page directory
27mov $0x1000, %edi
28mov $0x2003, %eax
29mov %eax, (%edi)
30mov $0x1004, %edi
31mov $0x3003, %eax
32mov %eax, (%edi)
33
34// Load the page directory register
35mov $0x1000, %eax
36mov %eax, %cr3
37
38// Enable paging
39mov %cr0, %eax
40or $0x80000000, %eax
41
42// Clear EAX
43mov %eax, %cr0
44
45//Load using virtual memory address; EAX = 0xBEEF
46xor %eax,%eax
47mov $0x7FF000, %esi
48mov (%esi), %eax
49hlt
50