- 论坛徽章:
- 0
|
%include "dt.inc"
org 0100h ; COM文件
jmp label_inProtectMode
[SECTION .gdt] ; 定义描述符
null_GDT: descriptor 0,0,0 ; 空描述符
tast1GDT descriptor 0, tast1Len - 1, DA_C + DA_32
tast2GDT descriptor 0, tast2Len - 1, DA_C + DA_32
tssGDT: descriptor 0, tss_len - 1, DA_E386TSS ; TSS描述府
tss2GDT: descriptor 0, tss2_len - 1, DA_E386TSS
showGDT: descriptor 0B8000h, 0ffffh, DA_DRW ; 显存
GdtPtr dw $ - null_GDT ; GDTR界限
dd 0 ; GDTR基地址
tast1Selector equ tast1GDT - null_GDT
tast2Selector equ tast2GDT - null_GDT
tssSelector equ tssGDT - null_GDT ; TSS选择子
tss2Selector equ tss2GDT - null_GDT ; TSS2选择子
showSelector equ showGDT - null_GDT
[SECTION .TSS] ; 任务状态段TSS
[BITS 32]
label_tss:
DW 0 ; 链接字段
DW 0
DD 0 ; 0级堆栈指针
DW 0 ; SS0
DW 0
DD 0 ; 1级堆栈指针
DW 0 ; SS1
DW 0
DD 0 ; 2级堆栈指针
DW 0 ; SS2
DW 0
DD 0 ; CR3
DD 0 ; EIP
DD 0 ; EFLAGS
DD 0 ; EAX
DD 0 ; ECX
DD 0 ; EDX
DD 0 ; EBX
DD 0 ; ESP
DD 0 ; EBP
DD 0 ; ESI
DD 0 ; EDI
DW 0 ; ES
DW 0
DW 0 ; CS
DW 0
DW 0 ; SS
DW 0
DW 0 ; DS
DW 0
DW 0 ; FS
DW 0
DW 0 ; GS
DW 0
DW 0 ; LDT
DW 0
DW 0 ; TSS的特别属性字
DW $ - label_tss + 2 ; 指向I/0许可位图区的指针
DW 0FFH ; I/0许可位图结束字节
tss_len equ $ - label_tss
[SECTION .TSS2] ; 任务状态段TSS2
[BITS 32]
label_tss2:
DW 0 ; 链接字段
DW 0
DD 0 ; 0级堆栈指针
DW 0 ; SS0
DW 0
DD 0 ; 1级堆栈指针
DW 0 ; SS1
DW 0
DD 0 ; 2级堆栈指针
DW 0 ; SS2
DW 0
DD 0 ; CR3
DD label_tast2 ; EIP
DD 0 ; EFLAGS
DD 0 ; EAX
DD 0 ; ECX
DD 0 ; EDX
DD 0 ; EBX
DD 0 ; ESP
DD 0 ; EBP
DD 0 ; ESI
DD 0 ; EDI
DW 0 ; ES
DW 0
DW tast2Selector ; CS
DW 0
DW 0 ; SS
DW 0
DW 0 ; DS
DW 0
DW 0 ; FS
DW 0
DW 0 ; GS
DW 0
DW 0 ; LDT
DW 0
DW 0 ; TSS的特别属性字
DW $ - label_tss2 + 2 ; 指向I/0许可位图区的指针
DW 0FFH ; I/0许可位图结束字节
tss2_len equ $ - label_tss2
[SECTION .inProtectMode] ; 进入保护模式
[BITS 16]
label_inProtectMode:
mov ax, cs ; 初始化段寄存器
mov ds, ax
cli ; 清除EFLAGS的IF位(bit9),不响应可屏蔽中断
in al, 92h ; 打开A20地址线(bit1为1)
or al, 00000010b
out 92h, al
mov eax, cr0 ; 设置CRO的PE位(bit0)为1
or eax, 1
mov cr0, eax
xor eax, eax
mov eax, ds
shl eax, 4
add eax, null_GDT ; 初始化GDTR的基地址
mov dword [GdtPtr + 2], eax
lgdt [GdtPtr] ; 加载GDTR
xor eax, eax
mov eax, ds
shl eax, 4
add eax, label_tast1 ; 设置GDT中Tast1描述府的段基址
mov word [tast1GDT + 2], ax
shr eax, 16
mov byte [tast1GDT + 4], al
mov byte [tast1GDT + 7], ah
xor eax, eax
mov eax, ds
shl eax, 4
add eax, label_tast2 ; 设置GDT中Tast2描述府的段基址
mov word [tast2GDT + 2], ax
shr eax, 16
mov byte [tast2GDT + 4], al
mov byte [tast2GDT + 7], ah
xor eax, eax
mov eax, ds
shl eax, 4
add eax, label_tss ; 设置GDT中TSS描述府的段基址
mov word [tssGDT + 2], ax
shr eax, 16
mov byte [tssGDT + 4], al
mov byte [tssGDT + 7], ah
xor eax, eax
mov eax, ds
shl eax, 4
add eax, label_tss2 ; 设置GDT中TSS2描述府的段基址
mov word [tss2GDT + 2], ax
shr eax, 16
mov byte [tss2GDT + 4], al
mov byte [tss2GDT + 7], ah
jmp dword tast1Selector:0 ; 调用tast1的代码
[SECTION .tast1] ; tast1
[BITS 32]
label_tast1:
mov ax, tssSelector
ltr ax
jmp tss2Selector:0
tast1Len equ $ - label_tast1
[SECTION .tast2] ; tast2
[BITS 32]
label_tast2:
mov ax, showSelector
mov gs, ax
mov edi, (80 * 10 + 10) * 2
mov ah, 0Ch
mov al, '2'
mov [gs:edi], ax
jmp $
tast2Len equ $ - label_tast2 |
|