仅仅是把描述符的基地址改成了0x10000,之后的每个全局符号后就都省去了它,真的是非常的简单易行。
;kernel.asm
bits 32
kernel_start:
mov ax, 2 * 8
mov ds, ax
lgdt [gdtr + 0x10000]
mov ax, 2 * 8
mov ds, ax
mov es, ax
mov ss, ax
mov fs, ax
mov esp, kernel_stack_top
mov ax, 3 * 8
mov gs, ax
jmp dword 1 * 8:new_start
new_start:
mov ecx, 80 * 25
mov ax, 3 * 8
mov es, ax
mov edi, 0
mov ax, 0
rep stosw
mov ax, 2 * 8
mov es, ax
; mov ebx, 0
; mov al, 'L'
; mov ah, 12
; mov [gs:ebx], ax
push 12
push 'L'
call _putc
add esp, 2 * 4
push 13
push 'z'
call _putc
add esp, 2 * 4
push 14
push 'h'
call _putc
add esp, 2 * 4
push 15
push 'q'
call _putc
add esp, 2 * 4
mov ecx, 10
.1:
push 15
push '$'
call _putc
add esp, 2 * 4
loop .1
jmp $
_putc: ; void putc(char c, int colour);
push ebp
mov ebp, esp
mov ebx, [_pos]
mov al, [esp + 2 * 4]
mov ah, [esp + 3 * 4]
mov [gs:ebx], ax
inc ebx
inc ebx
mov [_pos], ebx
pop ebp
ret
_pos: dd 0
align 8
gdt_start:
dq 0x0000000000000000 ; 0 * 8
dq 0x00c09a010000ffff ; 1 * 8
dq 0x00c092010000ffff ; 2 * 8
dq 0x00c0920b8000ffff ; 3 * 8
gdt_end:
gdtr:
dw gdt_end - gdt_start - 1
dd 0x10000 + gdt_start
times 1024 dd 0
kernel_stack_top: