Tp assembleur

Fermé
abf - 30 déc. 2007 à 14:24
 Alfa - 16 juil. 2013 à 21:05
Bonjour,
bonjour tous le monde, c'est ma premiere participation à ce forum, je salut tous le monde et je vous souhaite une bonne nouvelle année 2008...
en effet je cherche de l'aide pour realiser mon tp en assembleur.
voici l'enoncé :

Sous le systeme d'exploitation DOS, il existe deux situation dans lesquelles un programme peut etre terminé pratiqment à n'importe quel moment du fait de l'intervention d'événements échappant totalement au contrôle du programme, Ces situation survienent lorsque l'utilisateur actionne la touche <Ctrl_Break> ou bien lorsqu'apparait , lors de l'acce a un peripherique externe (imprimante, disque dur, lecteur de dicquette , etc...), un défaut parteculierement grave. Un arrét brusque du programme ne va pas sans poser de problemes. Le programme se termine par le fait que le DOS reprend le contrôle de l'exucution, de sorte que les instruction normalement exécutéés lors de la fin réguliere du programme se trouvent tout simplement ignioreéés. Ilon resulte que les fichiers ouverte ne sont pas fermes comme il conviendrait, que les vecteurs d'interruption rediriges ne sont pas restaurs et que la memoire allouée n'est pas restaurée. Toutes ces concequences peuvent déboucher sur une perte de données ou meme sur le plantage du systeme

Si pendant l'accés à un disque, un probleme survient (Disquette protégée contre l'ecriture, Unite de disquette non prete, ...), l'interruption 24h est automatiqment déclenchée invoquant une routine qui sort sur l'ecran le message bien connu « (A)bort, (R)etry ,(I)gnore »et attend une entrée de l'utilisateur. Pour pouvoir localiser l'erreur. Le D.O.S transmet à cette routine dans les 8bits de faible poids de DI un code d'erreur:

00h Disquette protégeée contre l'ecteure
01h Acces à un peripherique inconnu
02h Unité de disquette n'est pas préte
03h Ereure inconue
04h Ereure CRC
05h Longueur de données erronnée
06h Erreure de recherche
07h Type de péripherique inconnu
08h Secteur non trouvé
09h Plus de papier dans l'imprimente
0Ah Ereure d'ecriture
0Bh Ereure de lecteure
0Ch Ereure générale

le D.O.S attend alors que lui soit transmis dans le registre AL un code indiquant comment il doit réagir à l'erreure:


00h Igniorer l'erreur
01h Répéter l'operation
02h Terminer le programme à travrs l'interruption 23h
03h Terminer la fonction appelée avec erreur (positionne le flag carry)

Lobjet de ce T.p consistera à écrire un programme redirigeant cette interruption sur routine à lui . De façon à garder le contrôle des évenement lorsq'une erreure critique survient.

La nouvelle rouytine de gestion de l'interuption 24h (Traite_Erreure_critique), ce doit de positionner un flag (flag_Erreure_ critique). D'afficher un message indique le type de d'erreure . Puis de redonner la main au D.O.S avec un code de retoure 03h(Terminer la fonction appéleée)

Apre la rentative ou d'arreter la programme . Dans le derniere cas , unez simulation d'une arrét propre du programme zsera engagée. Le programme pouyrra étre teste en rentant d'ouvrir un fichier

sur une unite disque nonpréte(Exp: disquette inexistant).

1.Commencer par edevelopper les routines et macros suivantes:
Traite_erreure_critiquePROC FAR
Cette vroutine prendra en charge la gestion de l'interruption Erreur_Critique(24).
(Voir description çi dissus)

Redirige_Int MACRO Num_Int , Adr Seg routine ,Adr_ofs_routine

Cette macro ce edoit de modifier léentrée 'Num_Int du vecteur D'intereptions par l'adresse de la routine (dans notre cas Traite_erreure _critique)spesifiée en parametre .


Ouvrire_fichier MACRO nom fichier
Ouvrire le fichier 'nom fichier 'en mode lecteure
cette routine simuler la fonction principale du programme sur le quel sera exprimenté la technique de detournement de l'interruption 24h

Remarque1:

pour le developpement del a macro redige_int, on pourra faire appel à la fonction suivante de l'inturruption 21h

du DOS:
interruption : 21H
num. fonction : 25H
definition cette fonction permet de modifier une adresse dans le vecteur d'interruption pour qu'elle pointe vers une routine particuliére de traitement d'interruption.

Parametres d'entrés:
AH :25H
AL : numéro de l'interruption dont l'adresse dans le vecteur d'interruption sera modifié.
DS DX : segment : offset de la nouvelle routine de traitement de l'interruption dont le num est identique dans AL.
Néant.


Remarque 2:

pour le developpement de la macro 'ouvrir_fichier », on pourra faire appel a la fontion suivante de l'interruption 21h du DOS:

interruption : 21H
num.fontion 3dH
definition :
cette fonction permet d'ouvrir sur un disque un fichier en lecture/ecriture.
Parametres d'entrée:
AH : 3dH
AL : mode d'ouverture du fichier (lecture 0)
DS : DX: segment offset la chaine contenant le nom ainsi que le chemin d'accès du fichier à ouvrir (exp: a:\test.txt)
parametre de sortie :
néant.


2- ecrire le programme final en integrant les rouitines et macros de la question


merci d'avan

9 réponses

pascal.barbier Messages postés 33 Date d'inscription samedi 8 décembre 2007 Statut Membre Dernière intervention 7 décembre 2008 6
30 déc. 2007 à 14:33
Bonjour, bienvenue sur ce forum et bonnes fêtes à toi aussi.

Ton post ne contient aucune question (à part celles de ton prof).
Quel est ton problème ?
Le site est un site d'information et d'assistance, a priori il n'est pas destiné à faire les devoir des étudiants.
Commences par travailler sur le sujet et ensuite nous serons heureux de t'aider sur les problèmes que tu rencontres.
Si ton problème est un problème de compréhension générale de l'énoncé de l'exercice, fais nous le savoir et nous te dirigerons vers les tutoriels adaptés.

Cordialement
0
ok mon problème c'est le positionnement du flag.
comment je peut positionner un flag?
0
pascal.barbier Messages postés 33 Date d'inscription samedi 8 décembre 2007 Statut Membre Dernière intervention 7 décembre 2008 6
30 déc. 2007 à 14:42
Dans l'énoncé, le flag "flag_Erreure_ critique" désigne une variable que tu dois créer dans le programme et qui pourra contenir la valeur vrai ou faux. Un bit suffit, ici, puisqu'aucune autre variable de type bit n'est nécessaire, tu peux réserver un octet et y placer la valeur 1(pour vrai) ou 0 (pour faux).
0
Bonjour Pascal,
STP j'ai un TP d'assembleur. Est ce que tu peux me le faire et c'est payant biensur
Merci. ***@***
0
merci beaucoup pascal. barbier

pour tout les if3, j'ai trouvé une solution (pas définitive) c cellle ci:

redirection vers la routine traite_erreur_critique

redirige_int macro num_int, adr_ofs_routine

mov ds, adr_ofs_routine

mov al,num_int

mov ah,25h

int 21



endm;

;*********************************

ouvrir_fichier macro chams





mov al,1 ;mode d'ouverture du fichier(ecriture)

mov dx, chams

mov al,3dh

int 21h



endm;



;*********************************************************************









title interruption24h



;*********************************************************************

pile segment stack

dw 256 dup(?)

pile ends







donnee segment



msg db "(A)bort, (R)etry, (I)gnore";

msg0 db "disquette protégée contre l'ecriture"

msg1 db "acces a un peripherique inconnu"

msg2 db "unité de disquette n'est pas prete"

msg3 db "erreur inconnu"

msg4 db "erreur crc"

msg5 db "longuer de donnée erronée"

msg6 db "erreur de recherche"

msg7 db "type de peripherique inconnu"

msg8 db "secteur no trouvé"

msg9 db "plus de papier dans l'imprimante"

msgAH db "erreur d'ecriture"

msgBH db "erreur de lecture"

msgCH db "erreur geneale"

mesg db " repeter la tentative d'acces ou arreter"

chams db "x:\chams.txt"

routine db "traite_erreur_acritique"

num_inter db "24h"

donnee ends





;*********************************************************************

code segment



assume cs:code, ss:pile, ds:donnee







mov dx, donnée

mov ds, dx



redirige_int macro num_int, adr_ofs_routine



ouvrir_fichier macro chams

call trite_erreur_critique

code ends

; *************************************



traite_erreur_acritique proc far

; affichage du message sur l'ecran

mov ah,9

lea dx,msg

int 21



; comparaion du contenu de DI avec les differents types d'interruptions

cmp di,00h

jne case1



mov ah,9

lea dx,msg0

int 21

jmp endswitch



case1: cmp di,01h

jne case2



mov ah,9

lea dx,msg1

int 21

jmp endswitch



case2: cmp di,02h

jne endswitch



mov ah,9

lea dx,msg2

int 21

jmp endswitch



case3: cmp di,03h

jne case3



mov ah,9

lea dx,msg3

int 21

jmp endswitch



case4: cmp di,04h

jne case3



mov ah,9

lea dx,msg4

int 21

jmp endswitch





case5: cmp di,05h

jne case5



mov ah,9

lea dx,msg5

int 21

jmp endswitch







case6: cmp di,06h

jne case7



mov ah,9

lea dx,msg6

int 21

jmp endswitch







case7: cmp di,07h

jne case8



mov ah,9

lea dx,msg7

int 21

jmp endswitch





case8: cmp di,08h

jne case9



mov ah,9

lea dx,msg8

int 21

jmp endswitch



case9: cmp di,09h

jne caseAH



mov ah,9

lea dx,msg9

int 21

jmp endswitch





caseAH: cmp di,0ah

jne caseBH



mov ah,9

lea dx,msgAH

int 21

jmp endswitch



caseBH: cmp di,0bh

jne caseCH



mov ah,9

lea dx,msgBH

int 21

jmp endswitch



caseCH:cmp di,0ch

jne endswitch



mov ah,9

lea dx,msg6

int 21

jmp endswitch





endswitch: ret; retour au dos

mov bh,03h

mov ah,9

lea dx,mesg

int 21





;assurer que l'utilisateur ne saisisse que a,r,i et faire le traitement

verif1: mov ah,1

int 21h

cmp al,'a'

jne verif2

int 02h

verif2: mov ah,1

int 21h

cmp al,'r'

jne verif3

int 01h

verif3: mov ah,1

int 21h

cmp al,'i'

jne vrif1

int 00h

ret

traite_erreur_critique endp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
merci beaucoup pascal. barbier

pour tout les if3, j'ai trouvé une solution (pas définitive) c cellle ci:

redirection vers la routine traite_erreur_critique

redirige_int macro num_int, adr_ofs_routine

mov ds, adr_ofs_routine

mov al,num_int

mov ah,25h

int 21



endm;

;*********************************

ouvrir_fichier macro chams





mov al,1 ;mode d'ouverture du fichier(ecriture)

mov dx, chams

mov al,3dh

int 21h



endm;



;*********************************************************************









title interruption24h



;*********************************************************************

pile segment stack

dw 256 dup(?)

pile ends







donnee segment



msg db "(A)bort, (R)etry, (I)gnore";

msg0 db "disquette protégée contre l'ecriture"

msg1 db "acces a un peripherique inconnu"

msg2 db "unité de disquette n'est pas prete"

msg3 db "erreur inconnu"

msg4 db "erreur crc"

msg5 db "longuer de donnée erronée"

msg6 db "erreur de recherche"

msg7 db "type de peripherique inconnu"

msg8 db "secteur no trouvé"

msg9 db "plus de papier dans l'imprimante"

msgAH db "erreur d'ecriture"

msgBH db "erreur de lecture"

msgCH db "erreur geneale"

mesg db " repeter la tentative d'acces ou arreter"

chams db "x:\chams.txt"

routine db "traite_erreur_acritique"

num_inter db "24h"

donnee ends





;*********************************************************************

code segment



assume cs:code, ss:pile, ds:donnee







mov dx, donnée

mov ds, dx



redirige_int macro num_int, adr_ofs_routine



ouvrir_fichier macro chams

call trite_erreur_critique

code ends

; *************************************



traite_erreur_acritique proc far

; affichage du message sur l'ecran

mov ah,9

lea dx,msg

int 21



; comparaion du contenu de DI avec les differents types d'interruptions

cmp di,00h

jne case1



mov ah,9

lea dx,msg0

int 21

jmp endswitch



case1: cmp di,01h

jne case2



mov ah,9

lea dx,msg1

int 21

jmp endswitch



case2: cmp di,02h

jne endswitch



mov ah,9

lea dx,msg2

int 21

jmp endswitch



case3: cmp di,03h

jne case3



mov ah,9

lea dx,msg3

int 21

jmp endswitch



case4: cmp di,04h

jne case3



mov ah,9

lea dx,msg4

int 21

jmp endswitch





case5: cmp di,05h

jne case5



mov ah,9

lea dx,msg5

int 21

jmp endswitch







case6: cmp di,06h

jne case7



mov ah,9

lea dx,msg6

int 21

jmp endswitch







case7: cmp di,07h

jne case8



mov ah,9

lea dx,msg7

int 21

jmp endswitch





case8: cmp di,08h

jne case9



mov ah,9

lea dx,msg8

int 21

jmp endswitch



case9: cmp di,09h

jne caseAH



mov ah,9

lea dx,msg9

int 21

jmp endswitch





caseAH: cmp di,0ah

jne caseBH



mov ah,9

lea dx,msgAH

int 21

jmp endswitch



caseBH: cmp di,0bh

jne caseCH



mov ah,9

lea dx,msgBH

int 21

jmp endswitch



caseCH:cmp di,0ch

jne endswitch



mov ah,9

lea dx,msg6

int 21

jmp endswitch





endswitch: ret; retour au dos

mov bh,03h

mov ah,9

lea dx,mesg

int 21





;assurer que l'utilisateur ne saisisse que a,r,i et faire le traitement

verif1: mov ah,1

int 21h

cmp al,'a'

jne verif2

int 02h

verif2: mov ah,1

int 21h

cmp al,'r'

jne verif3

int 01h

verif3: mov ah,1

int 21h

cmp al,'i'

jne vrif1

int 00h

ret

traite_erreur_critique endp
0
copyright:solution proposé par "chams"
0
oui cette solution est proposée par chams .

merci chams
0
je veux lire de clavier a partir de langage assembleur merci
0
pascal.barbier Messages postés 33 Date d'inscription samedi 8 décembre 2007 Statut Membre Dernière intervention 7 décembre 2008 6
14 mars 2008 à 13:35
par exemple int 16 :
http://heim.ifi.uio.no/~stanisls/helppc/int_16.html

ou encore
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_20/CH20-3.html
0