Comment programmer une interruption matérielle???

Comment programmer une interruption matérielle??? - ASM - Programmation

Marsh Posté le 06-04-2006 à 11:28:37    

Salut à tous.
Je dois, pour l'école, programmer un petit "os" (rire) sur 8086.

 

Pour
cela, j'ai mon main (modification des vecteurs d'interruptions), deux
processus (un qui affiche les lettres de a à z, l'autre qui affiche les
chiffres de 0 à 9) et un dispatcher qui donne le temps processeur à un
processus puis à l'autre.

 

Jusqu'à présent, j'ai du le faire à
l'aide d'interruption logicielle. La prochaine étape est la
modification de ces interruption en interruptions matérielles (08h)

 

Cependant, je n'ai aucune idée comment intégrer cela dans mon code.
Le voici, si cela peut vous aider.

 
Code :
  1. .Model Small
  2. .Stack
  3. .Code
  4.         acLettres db "A*"
  5.         acNombres db "0*"
  6.         awAX dw 0,0,0
  7.         awBX dw 0,0,0
  8.         awCX dw 0,0,0
  9.         awDX dw 0,0,0
  10.         awDI dw 0,0,0
  11.         awSI dw 0,0,0
  12.         awBP dw 0,0,0
  13.         awIndic dw 0,1100000000b,1100000000b
  14.         awIP dw 0,OFFSET nbrProcess,OFFSET clock
  15.         wpscour dw 0
  16.         wAdrEffective34 DW ?
  17.         wAdrSegment34 DW ?
  18.         wAdrEffective35 DW ?
  19.         wAdrSegment35 DW ?
  20.         wAdrEffective36 DW ?
  21.         wAdrSegment36 DW ?
  22. dispatcher PROC
  23.       ;1) Sauvegarde des registres
  24.         push bx
  25.         mov bx,CS:wpscour
  26.         mov CS:awAX[bx],ax
  27.         pop ax
  28.         mov CS:awBX[bx],ax
  29.         mov CS:awCX[bx],cx
  30.         mov CS:awDX[bx],dx
  31.         mov CS:awBP[bx],bp
  32.         mov CS:awDI[bx],di
  33.         mov CS:awSI[bx],si
  34.         mov bp,sp
  35.       ;2) Sauvegarde d'IP et des INDICATEURS
  36.         mov ax,[bp+0]
  37.         mov CS:awIP[bx],ax
  38.         mov ax,[bp+2]
  39.         mov CS:awIndic[bx],ax
  40.         add CS:wpscour,2
  41.         cmp CS:wpscour,4
  42.         jne suite
  43.         mov CS:wpscour,0
  44. suite:
  45.         mov bx,CS:wpscour
  46.       ;3) Modification d'IP et des INDICATEURS pour le processus suivant
  47.         mov ax,CS:awIP[bx]
  48.         mov [bp+0],ax
  49.         mov ax,CS:awIndic[bx]
  50.         mov [bp+2],ax
  51.       ;4) Restitution des registres
  52.         mov ax,CS:awAX[bx]
  53.         mov bx,CS:awBX[bx]
  54.         mov cx,CS:awCX[bx]
  55.         mov dx,CS:awDX[bx]
  56.         mov bp,CS:awBP[bx]
  57.         mov di,CS:awDI[bx]
  58.         mov si,CS:awSI[bx]
  59.         cmp CS:wpscour,0
  60.         je caracteres
  61.         call nbrprocess
  62. caracteres:
  63.         call charprocess
  64.         iret
  65. dispatcher ENDP
  66. mon_gest PROC
  67.       ;1) Sauvegarde des registres
  68.         push ax
  69.         push cx
  70.         push dx
  71.         push es
  72.         push di
  73.         push si
  74.       ;2) Calcul de l'adresse effective du premier char
  75.         mov ch, 0h
  76.         add cx, cx    ;X*2
  77.         mov al, 160
  78.         mul dl        ;Y*160
  79.         add cx, ax
  80.         mov bp, cx
  81.         mov cx, 0B800h
  82.         mov es, cx
  83.         mov si, 0h;decalage dans le tableau
  84.         mov di, 0h;decalage dans la mem video: Si*2
  85. deb_while:
  86.         mov al, [bx+si]
  87.         cmp al, '*'
  88.         je fin_while
  89.         mov BYTE PTR es:[bp+di],al
  90.         add di, 2h
  91.         inc si
  92.         jmp deb_while
  93. fin_while:
  94.       ;4) Restitution des registres
  95.         pop ax
  96.         pop cx
  97.         pop dx
  98.         pop es
  99.         pop di
  100.         pop si
  101.         iret
  102. mon_gest ENDP
  103. charProcess PROC
  104.         lea bx,CS:acLettres
  105.         mov cl,40
  106.         mov dl,5
  107.         mov CS:acLettres,'A'
  108.         mov CS:acLettres+1,'*'
  109. charwhile_deb:
  110.         int 34h
  111.         inc CS:acLettres
  112.         cmp CS:acLettres, 'Z'
  113.         je  finchar
  114.         cmp CS:acLettres, 'z'
  115.         jbe charwhile_deb
  116.         mov CS:acLettres, 'A'
  117.         jmp charwhile_deb
  118. finchar:
  119.         int 36h
  120.         jmp charwhile_deb
  121. charProcess ENDP
  122. nbrProcess PROC
  123.         lea bx,CS:acNombres
  124.         mov cl,40
  125.         mov dl,20
  126.         mov CS:acNombres,'0'
  127.         mov CS:acNombres+1,'*'
  128. nbrwhile_deb:
  129.         int 34h
  130.         inc CS:acNombres
  131.         cmp CS:acNombres, '9'
  132.         jbe nbrwhile_deb
  133.         int 36h
  134.         jmp nbrwhile_deb
  135. nbrProcess ENDP
  136. clock PROC
  137. clock ENDP
  138. main:
  139.       ;1) D‚finition des adr de l'intr 34h
  140.       ;1a) Sauvegarde des anciennes adresses de l'intr 34h
  141.         mov ah,35h
  142.         mov al,34h
  143.         int 21h
  144.         mov CS:wAdrSegment34,es
  145.         mov CS:wAdrEffective34,bx
  146.       ;1b) Modification des adresses de l'intr 34h
  147.         mov ah,25h
  148.         mov al,34h
  149.         lea dx,mon_gest
  150.         push cs
  151.         pop ds
  152.         int 21h
  153.       ;2) D‚finition des adr de l'intr 35h
  154.       ;2a) Sauvegarde des anciennes adr de l'intr 35h
  155.         mov ah,35h
  156.         mov al,35h
  157.         int 21h
  158.         mov CS:wAdrSegment35,es
  159.         mov CS:wAdrEffective35,bx
  160.       ;2b) Modifiaction des adresses de l'intr 35h
  161.         mov ah,25h
  162.         mov al,35h
  163.         lea dx,clock
  164.         push cs
  165.         pop ds
  166.         int 21h
  167.       ;3) D‚finition des adr de l'intr 36h
  168.       ;3a) Sauvegarde des anciennes adresses de l'intr 36h
  169.         mov ah,35h
  170.         mov al,36h
  171.         int 21h
  172.         mov CS:wAdrSegment36,es
  173.         mov CS:wAdrEffective36,bx
  174.       ;3b) Modification des adresses de l'intr 36h
  175.         mov ah,25h
  176.         mov al,36h
  177.         lea dx,dispatcher
  178.         push cs
  179.         pop ds
  180.         int 21h
  181.         mov ax,3;vidage d'‚cran
  182.         int 10h
  183.         call charProcess
  184.       ;Restitution des parametres initiaux
  185.         mov ah,25h
  186.         mov al,34h
  187.         mov ds,CS:wAdrSegment34
  188.         mov bx,CS:wAdrEffective34
  189.         int 21h
  190.         mov ah,25h
  191.         mov al,35h
  192.         mov ds,CS:wAdrSegment35
  193.         mov bx,Cs:wAdrEffective35
  194.         int 21h
  195.         mov ah, 4ch
  196.         int 21h
  197. end main
 

Merci à tous.

Reply

Marsh Posté le 06-04-2006 à 11:28:37   

Reply

Marsh Posté le 06-04-2006 à 11:36:59    

up

Reply

Marsh Posté le 06-04-2006 à 13:36:57    

Bonjour
S'il s'agit d'écrire un OS aussi mini soit-il, il faut s'affranchir du DOS sauf pour le chargement, la commutation d'os et la restauration.
Vu la difficultée de la chose en mode protégé, le mode réel semble une bonne solution mais à faire dans un DOS pur sans windows avec.
La première chose est d'écrire les gestionnaires d'interruptions que l'on veut remplacer. Ecrire une fonction générique d'écriture à l'écran qui pourra être appelée soit par interruption ou par un call par les programmes concurants (cela entraine à faire du code réentrant)
écire le code des deux programmes concurants, les mettres dans la file de l'ordonnanceur qui devra lorsqu'il n'a plus rien à faire, restaurer les interruptions d'origines puis retourner au dos. Une fois cela fait, sauvegarder la table d'interruption du dos puis remplacer les vecteurs utiles par les siens entre-autre le vecteur de l'interruption horloge pour pointer sur le nouvel ordonnanceur qui trouvera une file de chose à faire (les 2 programmes) et les exécutera.
Le code doit évidemment être abondamment commenté afin d'être relu sans peine par d'éventuels relecteurs qui n'ont pas forcément la même logique.
J'espère ne pas avoir trop dit de bétise. Normalement les pros devraient corriger.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed