88 lines
1.5 KiB
Plaintext
88 lines
1.5 KiB
Plaintext
## 16-bit code
|
|
|
|
# Entry:
|
|
00:
|
|
bd 00 90 # bp <- 0x9000
|
|
89 ec # sp <- bp
|
|
|
|
bb 8f 7c # bx <- MSG_REAL_MODE
|
|
e8 38 00 # call print_string
|
|
|
|
e8 02 00 # call switch_to_pm
|
|
eb fe # jump $ (should never get here)
|
|
|
|
# switch_to_pm:
|
|
10:
|
|
fa # cli
|
|
0f 01 16 3d 7c # lgdt [gdt_descriptor]
|
|
0f 20 c0 # eax <- cr0
|
|
66 83 c8 01 # eax <- or 0x1
|
|
0f 22 c0 # cr0 <- eax
|
|
20:
|
|
ea 53 7c 08 00 # jmp CODE_SEG:init_pm
|
|
|
|
# gdt_start:
|
|
# gdt_null: mandatory null descriptor
|
|
00 00 00 00 00 00 00 00
|
|
# gdt_code:
|
|
ff ff 00
|
|
30:
|
|
00 00 9a cf 00
|
|
# gdt_data:
|
|
ff ff 00 00 00 92 cf 00
|
|
# gdt_end:
|
|
|
|
# gdt_descriptor:
|
|
3d:
|
|
17 00 # limit
|
|
25 7c 00 00 # start
|
|
|
|
# print_string:
|
|
43:
|
|
60 # pusha
|
|
b4 0e # ah <- 0x0e
|
|
# loop:
|
|
8a 07 # al <- *bx
|
|
cd 10 # int 10h
|
|
83 c3 01 # add bx, 1
|
|
3c 00 # cmp al, 0
|
|
75 f5 # jne loop
|
|
61 # popa
|
|
c3 # ret
|
|
|
|
## 32-bit code
|
|
|
|
# init_pm:
|
|
53:
|
|
66 b8 10 00 # ax <- DATA_SEG
|
|
8e d8 # ds <- ax
|
|
8e d0 # ss <- ax
|
|
8e c0 # es <- ax
|
|
8e e0 # fs <- ax
|
|
8e e8 # gs <- ax
|
|
61:
|
|
bd 00 00 09 00 # ebp <- 0x90000
|
|
89 ec # esp <- ebp
|
|
bb ab 7c 00 00 # ebx <- MSG_PROT_MODE
|
|
e8 02 00 00 00 # call print_string_pm
|
|
eb fe # hang
|
|
|
|
# print_string_pm:
|
|
74:
|
|
60 # pusha
|
|
ba 00 80 0b 00 8a 03 b4 0f 3c 00
|
|
80:
|
|
74 0b 66 89 02 83 c3 01 83 c2 02 eb ed 61 c3 53
|
|
90:
|
|
74 61 72 74 65 64 20 69 6e 20 31 36 2d 62 69 74
|
|
a0:
|
|
20 52 65 61 6c 20 4d 6f 64 65 00 53 75 63 63 65
|
|
b0:
|
|
73 73 66 75 6c 6c 79 20 6c 61 6e 64 65 64 20 69
|
|
c0:
|
|
6e 20 33 32 2d 62 69 74 20 50 72 6f 74 65 63 74
|
|
d0:
|
|
65 64 20 4d 6f 64 65
|
|
|
|
# vim:ft=conf
|