SECTIONS {
/* loader starts at <seg>:100h */
. = 0x100;
- .loader : {
- * (.loader);
- * (.ldrtext);
- }
+ .loader : { * (.loader); }
+
+ . = ALIGN(4);
+ _ldr_main_start = .;
/* main program will be moved to 2MB by the loader */
. = 2M;
section .loader
extern startup
- extern tmpsegbase
+
+ extern _ldr_main_start
+ extern _main_start
+ extern _main_size
[bits 16]
global _start
xor eax, eax
mov ax, cs
shl eax, 4
- mov [tmpsegbase], eax ; save segment base
add eax, gdt
mov [gdt_base], eax
[bits 32]
.pm: mov ax, 20h ; tmp data selector
mov ds, ax
- mov ss, ax
mov ax, 10h ; dest data selector
mov es, ax
+ ; copy main program high
+ cld
+ mov esi, _ldr_main_start
+ mov edi, _main_start
+ lea ecx, [_main_size + 3]
+ shr ecx, 2
+ rep movsd
+
+ mov ax, 10h
+ mov ds, ax
+ mov ss, ax
mov esp, 200000h
- call startup
+ call 8:startup
; return to real mode
jmp 28h:.rm