保護模式,稍作改動,去除了0x10000

 僅僅是把描述符的基地址改成了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:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章