保护模式,稍作改动,去除了0x10000

33 篇文章 0 订阅
12 篇文章 0 订阅

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_39410618

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值