4         mov ax, 0xA800                  ; Take us out of flat unreal mode,
 
   5         mov ds, ax                      ; and put us in true real mode.
 
  10         jmp 0xA800:(entry2-0xA8000)     ; Long jump to a correct cs.
 
  12         lgdt [(gdtr-0xA8000)]           ; Set up a new GDT.
 
  14         mov cr0, eax                    ; ... and enter pmode!
 
  15         jmp long 0x10:continue          ; Now longjmp into the new code.
 
  18         mov ax, 0x08                    ; Set up segment selectors.
 
  24         mov esp, [dataptr]              ; Load stack pointer.
 
  26         mov al, [needclear]             ; Has the aseg been run before?
 
  28         jz noclear                      ; don't clear BSS.
 
  29         mov al, 0                       ; Otherwise, clear BSS.
 
  36         mov eax, [dataptr+12]           ; Load target jump address
 
  37         call eax                        ; then jump into C.
 
  47         db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00       ; initial null entry
 
  48         db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x93, 0xCF, 0x00       ; data segment
 
  49         db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9B, 0xCF, 0x00       ; code segment
 
  55         ; 4 bytes of stack top
 
  56         ; 4 bytes of BSS start
 
  57         ; 4 bytes of BSS length
 
  58         ; 4 bytes of C entry point