User:Johnburger/Demo/Boot/Entry
< User:Johnburger | Demo
Jump to navigation
Jump to search
On entry to my code, different BIOSes have different values for CS:IP
. I want to use CS
-relative addressing, so the very first thing I do is make sure that CS
is where I want it!
Then I fix the Stack so that it is no longer clobbering the Real Mode IVT...
Memory Map
After this code, the Memory Map will look like this:
Address | Usage |
---|---|
0000_0000h
|
Interrupt Vector Table |
0000_0400h
|
BIOS Data Area |
0000_0500h
|
Available |
0000_0600h
|
Master Boot Record (MBR) *
|
0000_0800h
|
Available |
0000_7C00h
|
SS:SP Stack Top
|
0000_7C00h
|
BIOS-loaded Boot Sector |
0000_7E00h
|
Available |
0009_F???h **
|
Extended BIOS Data Area |
000A_0000h
|
Adapter / ROM Area |
000B_8000h
|
Text Video Memory |
000F_0000h
|
BIOS ROM |
0010_0000h
|
High Memory ***
|
*
The MBR only exists here if the PC has booted from a Hard Drive.
**
An INT 12h will help identify this value.
***
Note that this memory is only accessible in Protected Mode - except for the first 64 kiB (less 16 bytes), which you can access with a Segment Register set to 0FFFFh
as long as the A20 Gate is off. By the way: DON'T DO THIS!
Demo/Boot/Entry.inc
;
; Boot/Entry.inc
;
ORG 0000h
; On Entry, different BIOSes have different values for CS:IP.
; I want to use CS-relative addressing, so make sure CS is where I want it!
Boot.Entry:
JMP (BIOS.Entry>>4) : .Start ; Go to known location
.Start:
XOR AX,AX ; Initialise the stack
MOV SS,AX ; The BIOS's place is ludicrous
MOV ESP,BIOS.Entry ; So put ESP somewhere sane
; Note we can now use 32-bit addressing with [ESP] to access the stack