; Le code de la deuxieme tache (pour etudier la commutation de taches) ; Auteur: Benoit Papillault ; Creation: Mercredi 2 Mars 1997 ; Derniere modification: Lundi 21 Avril 1997 .386 include pm.inc include tss.inc public le_tss2 data segment public use16 m_tache2 dw 20*2 dw 12 db 1ah,'La tache 2 s',27h,'execute...',0 le_tss2 db io_range+69h dup (0) data ends off_previous equ 0 off_esp0 equ 4 off_ss0 equ 8 off_esp1 equ 12 off_ss1 equ 16 off_esp2 equ 20 off_ss2 equ 24 off_cr3 equ 28 off_eip equ 32 off_eflags equ 36 off_eax equ 40 off_ecx equ 44 off_edx equ 48 off_ebx equ 52 off_esp equ 56 off_ebp equ 60 off_esi equ 64 off_edi equ 68 off_es equ 72 off_cs equ 76 off_ss equ 80 off_ds equ 84 off_fs equ 88 off_gs equ 92 off_ldtr equ 96 code16 segment public use16 assume cs:code16 assume ds:data public init_tss2 init_tss2 proc near push ax push ds push cx push di ; on initialise le segment de donnee mov ax,data mov ds,ax mov es,ax ; on initialise tous a zero mov cx,io_range+69h mov di,offset le_tss2 cld xor al,al rep stosb mov byte ptr ds:le_tss2[io_range+68h],-1 mov word ptr ds:le_tss2[66h],68h pop di pop cx pop ds pop ax ret init_tss2 endp code16 ends .386p code32 segment public use32 assume cs:code32 public tache2 tache2 proc far push ax push ds push esi mov ax,data32_sel mov ds,ax mov esi,offset m_tache2 call write_msg pop esi pop ds pop ax iretd tache2 endp public init_tss2_32 init_tss2_32 proc near push eax push ds mov ax,data32_sel mov ds,ax mov eax,esp sub eax,100 mov dword ptr ds:le_tss2[off_esp0],eax mov dword ptr ds:le_tss2[off_esp1],eax mov dword ptr ds:le_tss2[off_esp2],eax xor eax,eax mov ax,ss mov dword ptr ds:le_tss2[off_ss0],eax mov dword ptr ds:le_tss2[off_ss1],eax mov dword ptr ds:le_tss2[off_ss2],eax mov eax,cr3 mov dword ptr ds:le_tss2[off_cr3],eax mov dword ptr ds:le_tss2[off_eip],offset tache2 pushfd pop eax mov dword ptr ds:le_tss2[off_eflags],eax mov dword ptr ds:le_tss2[off_eax],eax mov dword ptr ds:le_tss2[off_ecx],eax mov dword ptr ds:le_tss2[off_edx],eax mov dword ptr ds:le_tss2[off_ebx],eax mov dword ptr ds:le_tss2[off_esp],esp mov dword ptr ds:le_tss2[off_ebp],eax mov dword ptr ds:le_tss2[off_esi],eax mov dword ptr ds:le_tss2[off_edi],eax xor eax,eax mov ax,es mov dword ptr ds:le_tss2[off_es],eax xor eax,eax mov ax,cs mov dword ptr ds:le_tss2[off_cs],eax xor eax,eax mov ax,ss mov dword ptr ds:le_tss2[off_ss],eax xor eax,eax mov ax,ds mov dword ptr ds:le_tss2[off_ds],eax mov dword ptr ds:le_tss2[off_fs],eax mov dword ptr ds:le_tss2[off_gs],eax xor eax,eax mov dword ptr ds:le_tss2[off_ldtr],eax pop ds pop eax ret init_tss2_32 endp public appel_tache2 appel_tache2 proc near push ax push fs call init_tss2_32 ; mov ax,tss2_sel ; mov fs,ax => exception 13, c'est normal, cf la doc du Pentium: ; toute tentative de charger un selecteur de TSS dans un registre ; de segment provoquera l'exception 13 ; call far tss2_sel:tache2 db 9ah dd 0 dw tss2_sel pop fs pop ax ret appel_tache2 endp code32 ends end