保护模式下的编程任务切换(源代码)

王朝other·作者佚名  2006-01-29
窄屏简体版  字體: |||超大  

;--------------------------------------------------------

ea20 macro ;//打开A20地址线

push ax

in al,92h

or al,00000010b

out 92h,al

pop ax

endm

;----------------------------------------------------------------------------

;关闭A20地址线

;----------------------------------------------------------------------------

da20 macro

push ax

in al,92h

and al,11111101b

out 92h,al

pop ax

endm

;----------------------------------------------------------------------------

jump macro selector,offsetv ;//跳转宏

db 0EAh

dw offsetv

dw selector

endm

;--------------------

call16 macro selector,offsetv

db 9Ah

dw offsetv

dw selector

endm

;----------------------

descriptor struc ;//描述符的结构

limitl dw 0

basel dw 0

basem db 0

attributes dw 0

baseh db 0

descriptor ends

;-----------------------------------------------------------------------------

gate struc

offsetl dw 0

selector dw 0

dcount db 0

gtype db 0

offseth dw 0

gate ends

;--------------------

pdesc struc ;//伪描述府

limit dw 0

base dd 0

pdesc ends

;

atdw=92h ;存在的可读写数据段类型值

atce=98h ;存在的只执行代码段类型值

atcer=9ah ;存在的可执行可读代码段类型值

atldt=82h ;局部描述符表段类型值

TIL=04H

at386tss=89h

at386cgate=8ch ;386调用门类型值

attaskgat=85h ;任务门类型

dpl1 = 20h

dpl2 = 40h

dpl3 = 60h

rpl1 = 01h

rpl2 = 02h

rpl3 = 03h

.386P

gdtseg segment use16

gdt label byte

dummy descriptor <>

normal descriptor <0FFFFh,,,atdw,>

normal_sel=normal-gdt

code descriptor <0FFFFh,,,atce,>

code_sel=code-gdt

ldta descriptor <0FFFFh,,,atldt,>

ldta_sel=ldta-gdt

ldtb descriptor <0FFFFh,,,atldt,>

ldtb_sel=ldtb-gdt

tssa descriptor <0FFFFh,,,at386tss,>

tssa_sel=tssa-gdt

tssb descriptor <0FFFFh,,,at386tss,>

tssb_sel=tssb-gdt

tss0 descriptor <0FFFFh,,,at386tss,>

tss0_sel=tss0-gdt

temp descriptor <0FFFFh,,,atce,>

temp_sel=temp-gdt

stack0t descriptor <0ffffh,stack0,,atdw,>

stack0t_sel=stack0t-gdt

stack2t descriptor <0ffffh,stack2,,atdw+dpl2,>

stack2t_sel=(stack2t-gdt)+rpl2

stack3t descriptor <0ffffh,stack3,,atdw+dpl3,>

stack3t_sel=(stack3t-gdt)+rpl3

gdtlen=$-gdt

vgdtr pdesc <gdtlen-1,>

gdtseg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

sega segment use16

ldt label byte

dataa descriptor <0FFFFh,,,atdw+dpl2,>

dataa_sel=(dataa-ldt)+TIL+rpl2

codea descriptor <0FFFFh,,,atce+dpl2,>

codea_sel=(codea-ldt)+TIL+rpl2

vbufa descriptor <0FFFFh,8000h,0bh,atdw+dpl2,>

vbufa_sel=(vbufa-ldt)+TIL+rpl2

tob descriptor <0,tssb_sel,0,attaskgat+dpl3,0>

tob_sel=(tob-ldt)+TIL+rpl3

sega ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

segb segment use16

ldt1 label byte

datab descriptor <0FFFFh,,,atdw+dpl3,>

datab_sel=(datab-ldt1)+TIL+rpl3

codeb descriptor <0FFFFh,,,atce+dpl3,>

codeb_sel=(codeb-ldt1)+TIL+rpl3

vbufb descriptor <0FFFFh,8000h,0bh,atdw+dpl3,>

vbufb_sel=(vbufb-ldt1)+TIL+rpl3

torealm gate <tojump,temp_sel,0,at386cgate+dpl3,0>

torealm_sel=(torealm-ldt1)+TIL+rpl3

segb ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tss0seg segment use16

dd 0 ;back

dw stack0len,0 ;0级堆栈指针

dw stack0t_sel,0 ;初始化

dw 0,0 ;1级堆栈指针

dw 0,0 ;初始化

dw stack2len,0 ;2级堆栈指针

dw stack2t_sel,0 ;未初始化

dd 0 ;cr3

dw 0,0 ;eip

dd 0 ;eflags

dd ? ;eax

dd ? ;ecx

dd ? ;edx

dd ? ;ebx

dd stack0len ;esp

dd ? ;ebp

dd ? ;esi

dd ? ;edi

dw 0,0 ;es

dw code_sel,0 ;cs

dw stack0t_sel,0 ;ss

dw 0,0 ;ds

dw 0,0 ;fs

dw 0,0 ;gs

dw 0,0 ;ldt

dw 0

dw $+2 ;指向I/O许可位图

db 0FFh ;I/o许可位图结束标志

tss0seg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tssbseg segment use16

dd 0 ;back

dw stack0len,0 ;0级堆栈指针

dw stack0t_sel,0 ;初始化

dw 0,0 ;1级堆栈指针

dw 0,0 ;初始化

dw stack2len,0 ;2级堆栈指针

dw stack2t_sel,0 ;未初始化

dd 0 ;cr3

dw startb,0 ;eip

dd 0 ;eflags

dd ? ;eax

dd ? ;ecx

dd ? ;edx

dd 22 ;ebx

dd stack3len ;esp

dd ? ;ebp

dd ? ;esi

dd ? ;edi

dw vbufb_sel,0 ;es

dw codeb_sel,0 ;cs

dw stack3t_sel,0 ;ss

dw datab_sel,0 ;ds

dw 0,0 ;fs

dw 0,0 ;gs

dw ldtb_sel,0 ;ldt

dw 0

dw $+2 ;指向I/O许可位图

db 0FFh ;I/o许可位图结束标志

tssbseg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tssaseg segment use16

dd 0 ;back

dw stack0len,0 ;0级堆栈指针

dw stack0t_sel,0 ;初始化

dw 0,0 ;1级堆栈指针

dw 0,0 ;初始化

dw stack2len,0 ;2级堆栈指针

dw stack2t_sel,0 ;未初始化

dd 0 ;cr3

dw starta,0 ;eip

dd 0 ;eflags

dd ? ;eax

dd ? ;ecx

dd ? ;edx

dd 0 ;ebx

dd stack2len ;esp

dd ? ;ebp

dd ? ;esi

dd ? ;edi

dw vbufa_sel,0 ;es

dw codea_sel,0 ;cs

dw stack2t_sel,0 ;ss

dw dataa_sel,0 ;ds

dw 0,0 ;fs

dw 0,0 ;gs

dw ldta_sel,0 ;ldt

dw 0

dw $+2 ;指向I/O许可位图

db 0FFh ;I/o许可位图结束标志

tssaseg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dataaseg segment use16

yang db 'how are you',0

dataaseg ends

codeaseg segment use16

assume cs:codeaseg,ds:dataaseg

starta: lea si,yang

mov cx,11

again: mov al,[si]

mov ah,87h

mov es:[bx],ax

add bx,2

inc si

loop again

jump tob_sel,0 ;任务门

codeaseg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

databseg segment use16

hello db 'hello',0

hellolen=$-hello

databseg ends

codebseg segment use16

assume cs:codebseg,ds:databseg

startb: lea si,hello

mov cx,hellolen

again1: mov al,[si]

mov ah,0F4h

mov es:[bx],ax

add bx,2

inc si

loop again1

call16 torealm_sel,0 ;任务门

codebseg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tempseg segment use16

assume cs:tempseg

vitual: mov ax,tss0_sel

ltr ax

jump tssa_sel,0

tojump:

jump <code_sel>,<offset toreal>

tempseg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

stack0 segment ;0 stack

stack0len=512

db stack0len dup (0)

stack0 ends

;

stack2 segment ;2 stack

stack2len=512

db stack2len dup (0)

stack2 ends

;

stack3 segment ;3 stack

stack3len=512

db stack3len dup (0)

stack3 ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

sseg segment stack use16

dw 256 dup (?)

sseg ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cseg segment use16

assume cs:cseg,ds:gdtseg,ss:sseg

start: mov ax,gdtseg

mov ds,ax

mov bx,16

mul bx

add ax,offset gdt

adc dx,0

mov word ptr vgdtr.base,ax

mov word ptr vgdtr.base+2,dx

;

mov ax,cseg

mul bx

mov word ptr code.basel,ax

mov byte ptr code.basem,dl

mov byte ptr code.baseh,dh

;

mov ax,sega

mul bx

mov word ptr ldta.basel,ax

mov byte ptr ldta.basem,dl

mov byte ptr ldta.baseh,dh

;

mov ax,segb

mul bx

mov word ptr ldtb.basel,ax

mov byte ptr ldtb.basem,dl

mov byte ptr ldtb.baseh,dh

;

mov ax,tss0seg

mul bx

mov word ptr tss0.basel,ax

mov byte ptr tss0.basem,dl

mov byte ptr tss0.baseh,dh

;

mov ax,tssaseg

mul bx

mov word ptr tssa.basel,ax

mov byte ptr tssa.basem,dl

mov byte ptr tssa.baseh,dh

;

mov ax,tssbseg

mul bx

mov word ptr tssb.basel,ax

mov byte ptr tssb.basem,dl

mov byte ptr tssb.baseh,dh

;

mov ax,stack0

mul bx

mov word ptr stack0t.basel,ax

mov byte ptr stack0t.basem,dl

mov byte ptr stack0t.baseh,dh

;

mov ax,stack2

mul bx

mov word ptr stack2t.basel,ax

mov byte ptr stack2t.basem,dl

mov byte ptr stack2t.baseh,dh

;

mov ax,stack3

mul bx

mov word ptr stack3t.basel,ax

mov byte ptr stack3t.basem,dl

mov byte ptr stack3t.baseh,dh

;

mov ax,tempseg

mul bx

mov word ptr temp.basel,ax

mov byte ptr temp.basem,dl

mov byte ptr temp.baseh,dh

;

push ds

assume ds:sega

mov ax,sega

mov ds,ax

;

mov ax,dataaseg

mul bx

mov word ptr dataa.basel,ax

mov byte ptr dataa.basem,dl

mov byte ptr dataa.baseh,dh

;

mov ax,codeaseg

mul bx

mov word ptr codea.basel,ax

mov byte ptr codea.basem,dl

mov byte ptr codea.baseh,dh

;

assume ds:segb

mov ax,segb

mov ds,ax

;

mov ax,databseg

mul bx

mov word ptr datab.basel,ax

mov byte ptr datab.basem,dl

mov byte ptr datab.baseh,dh

;

mov ax,codebseg

mul bx

mov word ptr codeb.basel,ax

mov byte ptr codeb.basem,dl

mov byte ptr codeb.baseh,dh

;

pop ds

assume ds:gdtseg

lgdt qword ptr vgdtr

ea20

cli

mov eax,cr0

or ax,1

mov cr0,eax

jump <temp_sel>,<offset vitual>

toreal: mov ax,normal_sel

mov ds,ax

mov eax,cr0

and eax,0FFFFFFFEH

mov cr0,eax

jump <seg real>,<offset real>

real: da20

sti

mov ax,sseg

mov ss,ax

mov sp,512

mov ah,4ch

int 21h

cseg ends

end start

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航