Editeur de texte simple (sans modification du texte)

Contenu du snippet

voila mon premier programme en Assembleur.
C'est un petit éditeur de texte, qui permet : créer un fichier
ensuite d'écrire dans le fichier
Lire un Fichier
Je fais qui lise que 200 caractère mais ça peut être modifier facilement
Si vous avez des questions j'essairai d'y répondre

(Désolé pour les fautes d'ortographe j'ai jamais été fort ^^)

Source / Exemple :


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

A voir également

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.