Soyez le premier à donner votre avis sur cette source.
Snippet vu 7 386 fois - Téléchargée 30 fois
TITLE Editeur de Texte By Brait Loic COMMENT @ Petit éditeur de texte permettant de lire/écrire un fichier -Edition de texte d'acheve avec un compinaison de touche -La touche return marche normalement -Utilisateur est invite à entrée le nom du fichier -Organisation du fichier est libre Auteur: Brait Loic Date de crétion: 22.05.05 Dernière modification: 22.05.05 Révison @ .MODEL small .STACK 100h .DATA nCarMaxMenu DB 2 nCarLuMenu DB ? strLuMenu DB 2 DUP(?) nCarMaxNom DB 9 nCarLuNom DB ? strLuNom DB 13 DUP(0) texte DB 200 DUP(?),'$' handleFichier DW ? handleFichierE DW ? BufferTexte DB 200 DUP(?),'$' ;Message d erreur ------------------------------------- FileSharingT DB 'Pas de logiciel de File Sharing$' nonFichierT DB 'Fichier non trouve$' cheminFauxT DB 'Chemin non trouve$' plusHandleT DB 'Plus de Handle libre$' accesRefuseT DB 'Acces Refuse$' nonHandleT DB 'Handle non autorise ou fichier correspondant non ouvert$' nonModeT DB 'Mode d acces non autorise$' ;----------------- ;Texte du pogramme ------------------------------------- textMenu DB 'Voici un editeur de texte qui a etait code en Assembleur par Brait Loic',13d,10d,'Choisissez l opperation$' choixMenu DB '1. Nouveau Fichier',13,10,'2. Lire Fichier','$' mauvaisChoixT DB 'LE CHOIX QUE VOUS AVEZ FAIT N EST PAS CORRECTE REFAITE LE !!!$' entreeNom DB 'Veuillez entrez le nom du fichier (sans extension)$' entreeTexteT DB 'Veuillez entrez le texte du fichier',13,10,'Pour Quitter Pressez la touche DOLLARD$' ;---------------------- ;Mise en page------------ extension DB '.txt$' etoile DB '*$' retourT DB 13,10 retour DB 13,10,'$' blanc DB ' $' ;------------------------- .CODE main PROC MOV ax,@data MOV ds,ax ;************************************* ;Debut du progrmamme ================= ;Nettoyage des registres SUB AX,AX SUB BX,BX SUB CX,CX SUB DX,DX SUB SI,SI SUB DI,DI LEA DX,textMenu CALL afficheTexte ;Affiche le texte LEA DX,retour CALL afficheTexte ;Affiche un espace mauvaischoix: LEA DX,choixMenu CALL afficheTexte ;Affiche le choix LEA DX,nCarMaxMenu CALL demandeTexte ;Demande le choix MOV AL,[strLuMenu] CALL transASCII ;le choix transformer en nombre MOV AH,1d CMP AH,AL JZ nouveau ;choix Nouveau Fichier MOV AH,2d CMP AH,AL JZ lire ;choix lire et ecrire un fichier ;Choix pas correcte ----------------------------- LEA DX,retour CALL afficheTexte ;Affiche un espace LEA DX,mauvaisChoixT CALL afficheTexte JMP mauvaisChoix ;Mauvais Choix effectuer nouveau: ;--------------------------------------------------------- LEA DX,entreeNom CALL afficheTexte ;Affiche le texte de la demande su nom LEA DX,nCarMaxNom CALL demandeTexte ;Demande le nom du fichier ;Ajoute le .txt$ au nom CALL ajouteExt ;Cree le fichier LEA DX,strLuNom CALL nouveauFichier MOV handleFichier,AX JMP ecrire ;pour ecrire dans le fichier lire: ;---------------------------------------------------------------- ;Affiche le texte de la demande de nom LEA DX,entreeNom CALL afficheTexte ;Demande le nom du fichier LEA DX,nCarMaxNom CALL demandeTexte ;Ajouter l extension CALL ajouteExt ;Ouvrir le fichier LEA DX,strLuNom MOV CX,10100010b ;Mode d'acces (lecture/ecriture, lecture seul pour les autres prog, seul le prg actuel peut accéder) CALL ouvrirFichier MOV handleFichier,AX ;Lire le fichier LEA DX, BufferTexte MOV BX,handleFichier MOV CX,200 ;taille du buffer CALL lireFichier ;Afficher le texte du fichier LEA DX,BufferTexte CALL afficheTexte ;Fermer le Fichier MOV BX,handleFichier CALL fermerFichier CALL quitter ;Arreter le prg ecrire: ;---------------------------------------------------------- ;Afficher la Demander d'ecrire le texte LEA DX,entreeTexteT CALL afficheTexte MOV CX,200d SUB DI,DI boucleTexte: ;Demander le texte CALL ecrireTexte MOV [texte+DI],AL ;Tester Si la touche est ENTER---------- MOV AH,0Dh CMP AH,AL JZ aLaLigne ;Tester Si c'est la touchre BackSpace------- MOV AH,8h CMP AH,AL JZ backSpace ;Tester Si c'est pour quitter------------ MOV AH,24h CMP AH,AL JZ quitterLePrg JMP normal aLaLigne: ;++++++++++++++++++++++++++++++ ;Ecrire dans le fichier LEA DX,retourT MOV BX,handleFichier SUB CX,CX MOV CL,2 ;nombre de caractère a ecrire CALL ecrireFichier ;Afficher la lettre LEA DX,blanc CALL afficheTexte JMP continue backSpace: ;++++++++++++++++++++++++++++++ ;Ecrire dans le fichier JMP continue quitterLePrg: ;+++++++++++++++++++++++++++ ;Fermer le Fichier MOV BX,handleFichier CALL fermerFichier ;Quitter le Programme CALL quitter normal: PUSH CX ;Ecrire normalement une lettre++++++++++++++ ;Ecrire dans le fichier LEA DX,[texte+DI] MOV BX,handleFichier SUB CX,CX MOV CL,1 ;nombre de caractère a ecrire CALL ecrireFichier ;Afficher la lettre INC DI MOV [texte+DI],24h DEC DI LEA DX,[texte+DI] CALL afficheTexteEcrire continue: POP CX INC DI LOOP boucleTexte ;Fermer le Fichier MOV BX,handleFichier CALL fermerFichier ;Fin du programme ======================= ;**************************************** MOV ah,4ch MOV al,0 INT 21h main ENDP ;##################################### afficheTexte PROC USES AX ;Affiche le texte envoyé ;Entrée DX : offset du texte à afficher ; ;Sortie Texte à l'écran ;##################################### MOV AH,09h INT 21h ;retour a la ligne------------------ LEA DX,retour MOV AH,09h INT 21h RET afficheTexte ENDP ;##################################### afficheTexteEcrire PROC USES AX ;Affiche le texte envoyé ;Entrée DX : offset du texte à afficher ; ;Sortie Texte à l'écran ;##################################### MOV AH,09h INT 21h RET afficheTexteEcrire ENDP ;##################################### demandeTexte PROC USES AX ;Demande le texte et le met dans un tableau ;Entrée DX : offset du Tableau (interuption) ; ;Sortie Aucune ;##################################### ;entree la valeur ------------------------ MOV AH,0Ah ;fonction INT 21h ;interruption ;retour a la ligne-------------------- LEA DX,retour MOV AH,09h INT 21h RET demandeTexte ENDP ;##################################### ecrireTexte PROC ;Pour ecrire du texte demande lettre par lettre ;Entrée - ; ;Sortie AL : caractère ecrit ;##################################### ;entree la valeur ------------------------ MOV AH,07h ;fonction INT 21h ;interruption RET ecrireTexte ENDP ;##################################### transASCII PROC ;Transforme un nombre ASCII en chiffre ;Entrée AL : nombre en ASCII ; ;Sortie AL : nombre en chiffre ;##################################### SUB AL,48d RET transASCII ENDP ;##################################### ajouteExt PROC ;Ajoute à la fin du nom du fichier l'extension avec le signe de fin ;Entrée strLuNom : nom du fichier ; nCarLuNom : nombre caractere entrée ; ;Sortie - ;##################################### SUB AH,AH MOV AL,nCarLuNom MOV SI,AX ;.txt$ MOV [strLuNom+SI],46d INC SI MOV [strLuNom+SI],116d INC SI MOV [strLuNom+SI],120d INC SI MOV [strLuNom+SI],116d INC SI MOV [strLuNom+SI],24h RET ajouteExt ENDP ;##################################### nouveauFichier PROC ;Cree un nouveau fichier ;Entrée DS : @segment du nom du fichier ; DX : @offset du nom du fichier ; ;Sortie - ;##################################### MOV AH,3Ch INT 21h ;Si le Carry est à 1 alors lancer la procedure qui va voire le type d'erreur JNC pasLancerAffichageErreurNouveau CALL typeErreur pasLancerAffichageErreurNouveau: RET nouveauFichier ENDP ;##################################### ouvrirFichier PROC ;Ouvre un fichier ;Entrée DS : @segment du nom du fichier ; DX : @offset du nom du fichier ; AL : Mode d'accès ; ;Sortie AX : OK(Handle) ou Code erreur ;##################################### SUB AX,AX MOV AH,3Dh INT 21h ;Si le Carry est à 1 alors lancer la procedure qui va voire le type d'erreur JNC pasLancerAffichageErreurOuvrir CALL typeErreur pasLancerAffichageErreurOuvrir: RET ouvrirFichier ENDP ;##################################### typeErreur PROC USES BX ;Indique le Type d'erreur (Optimisation faire relancer le prg) ;Entrée AX : Code de l erreur ; ;Sortie Affiche à l ecran le type d erreur ;##################################### MOV BX,1 CMP AX,BX JZ FileSharing MOV BX,2 CMP AX,BX JZ nonFichier MOV BX,3 CMP AX,BX JZ cheminFaux MOV BX,4 CMP AX,BX JZ plusHandle MOV BX,5 CMP AX,BX JZ accesRefuse MOV BX,6 CMP AX,BX JZ nonHandle MOV BX,12 CMP AX,BX JZ nonMode ;Erreur de manque de logiciel de File Sharing FileSharing: LEA DX,FileSharingT CALL afficheTexte CALL quitter ;Fichier non trouvé nonFichier: LEA DX,nonFichierT CALL afficheTexte CALL quitter ;Chemin non trouvé cheminFaux: LEA DX,cheminFauxT CALL afficheTexte CALL quitter ;Plus de Handle libre plusHandle: LEA DX,plusHandleT CALL afficheTexte CALL quitter ;Acces Refusé accesRefuse: LEA DX,accesRefuseT CALL afficheTexte CALL quitter ;Handle non autorise ou fichier correspond non ouvert nonHandle: LEA DX,nonHandleT CALL afficheTexte CALL quitter ;Mode d acces non autorise nonMode: LEA DX,nonModeT CALL afficheTexte CALL quitter RET typeErreur ENDP ;##################################### lireFichier PROC USES BX CX ;lire un fichier ;Entrée DS : @segment du buffer ; DX : @offset du buffer ; BX : Handle du fichier ; CX : Nombre d octel a lire ; ;Sortie AX : nbr d octels lus ou Code erreur ;##################################### SUB AX,AX MOV AH,3Fh INT 21h ;Si le Carry est à 1 alors lancer la procedure qui va voire le type d'erreur JNC pasLancerAffichageErreurLire CALL typeErreur pasLancerAffichageErreurLire: RET lireFichier ENDP ;##################################### fermerFichier PROC ;ferme un fichier ;Entrée BX : Handle à fermer ; ;Sortie AX : OK(Handle) ou Code erreur ;##################################### SUB AX,AX MOV AH,3Eh INT 21h ;Si le Carry est à 1 alors lancer la procedure qui va voire le type d'erreur JNC pasLancerAffichageErreurFermer CALL typeErreur pasLancerAffichageErreurFermer: RET fermerFichier ENDP ;##################################### ecrireFichier PROC USES BX CX ;ecrire dans un fichier ;Entrée DS : @segment du buffer ; DX : @offset du buffer ; BX : Handle du fichier ; CX : Nombre d octel a ecrire ; ;Sortie AX : nbr d octels lus ou Code erreur ;##################################### SUB AX,AX MOV AH,40h INT 21h ;Si le Carry est à 1 alors lancer la procedure qui va voire le type d'erreur JNC pasLancerAffichageErreurLire CALL typeErreur pasLancerAffichageErreurLire: RET ecrireFichier ENDP ;##################################### quitter PROC ;quitter le prg ;Entrée - ; ;Sortie - ;##################################### MOV ah,4ch MOV al,0 INT 21h RET quitter ENDP END main
28 juin 2005 à 14:12
Si les SUB AX,AX consistent à mettre le registre à zéro, utilise plutôt XOR AX,AX
Utilise le plus possible les registres 16 bits au lieu de deux fois des registre 8 bits, ainsi
MOV ah,4ch
MOV al,0
INT 21h
peut avantageusement être remplacé par
MOV ax,4c00h
INT 21h
1 octet d'économisé
Quand tu fais des comparaisons
MOV BX,1 ;3 octets
CMP AX,BX ;2 octets
JZ FileSharing ;2 octets
MOV BX,2 ;3 octets
CMP AX,BX ;2 octets
JZ nonFichier ;2 octets
je suppose que AX contient le code d'erreur à tester; il semble plutôt que ce qui t'interesse est dans AL (les valeurs de comparaison sont inférieures à FFh). Effectue plutôt des comparaisont entre AL et des valeurs immédiates 8 bits. Par exemple les lignes ci dessus deviennent:
CMP AL,1 ;2 octets
JZ FileSharing ;2 octets
CMP AL,2 ;2 octets
JZ nonFichier ;2 octets
Par test 4 octets seulement sont consommés (au lieu de 7)
Autre astuce, pour comparer un registre à zéro faire
AND registre,registre positionne les flags avant un test
Bonne prog
28 juin 2005 à 21:48
Merci pour les conseils j'en prendrai compte par suite ^^
25 oct. 2005 à 14:48
28 oct. 2005 à 08:54
J ai essayé de le modifier mais il n'y a pas de commentaires ???
3 mars 2006 à 11:25
ce programme marche-t-il hors DOS, cad , à partir d'une disquette de boot par exemple, ou bien il faut dos ou win?
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.