OS-Design之GDT加载的伪代码和源码

【PCode:】
Gdt gdt={0,0,0};
Gdt gdt_code32={0,code32.length-1,DA_C+DA_32};
Gdt gdt_video={0B8000h,0ffffh,DA_DRW};
Gdt gdts[3]={,,};
 
Gdtr *gdtPtr={gdts.size-1,0};
Selector selector_code32=gdt_code32.offset;
...
ds=cs;
gdt_code32.base=code32;
gdtr=*gdtPtr;
...


 
%include "pm.inc"

org 07c00h
jmp main

[SECTION .gdt]
gdt: Descriptor 0,0,0
gdt_code32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
gdt_video:  Descriptor 0B8000h,           0ffffh, DA_DRW	     ; 显存首地址

gdtLen		equ	$ - gdt	; GDT长度
gdtPtr		dw	gdtLen - 1	; GDT界限
		    dd	0		; GDT基地址

; GDT 选择子
selector_code32		equ	gdt_code32 - gdt
selector_video		equ	gdt_video - gdt

[SECTION .s16]
[BITS	16]
main:
	mov	ax, cs
	mov	ds, ax

	xor	eax, eax
	mov	ax, cs
	shl	eax, 4
	add	eax, code32
	mov word [gdt_code32 + 2], ax
	shr	eax, 16
	mov	byte [gdt_code32 + 4], al
	mov	byte [gdt_code32 + 7], ah

	xor	eax, eax
	mov	ax, ds
	shl	eax, 4
	add	eax, gdt		; eax <- gdt 基地址
	mov dword [gdtPtr+2],eax
	lgdt [gdtPtr]
	
	cli
	in	al, 92h
	or	al, 00000010b
	out	92h, al
	mov	eax, cr0
	or	eax, 1
	mov	cr0, eax
	
	jmp	dword selector_code32:0
	
[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS	32]
code32:
	mov	ax, selector_video
	mov	gs, ax			; 视频段选择子(目的)

	mov	edi, (80 * 11 + 79) * 2	; 屏幕第 11 行, 第 79 列。
	mov	ah, 0Ch			; 0000: 黑底    1100: 红字
	mov	al, 'P'
	mov	[gs:edi], ax

	; 到此停止
	jmp	$

SegCode32Len	equ	$ - code32


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值