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
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.