1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
|
;############################################
;# Exercice pour l'examen de juin 2010 #
;# LAMBERT Loïc #
;# 06/06/2010 #
;# ASM EXAMEN #
;############################################
.MODEL SMALL
.STACK 128
;---------------------------------------------------------------------------------------------------
; Données
;---------------------------------------------------------------------------------------------------
.DATA
msgfi db 10, 13,"Entrez un nom de fichier: ","$", 10, 13
msgfin db 10, 13, "Tout c est deroule avec succes","$", 10, 13
msgerr1 db 10, 13,"Impossible d'ouvrir le fichier specifie","$", 10, 13
msgerr2 db 10, 13,"Impossible de lire le fichier specifie","$", 10, 13
msgtaille db 10, 13,"taille du fichier (en octets) :","$"
msgver db 10, 13, "message test$", 10, 13
fichier db 50 dup (" "),"$"
newfi db 14,?,13 dup(0)
handle1 dw ?
handle2 dw ?
taille1 dw ?
buffer db " une petite phrase quelquonque $";1024 dup(?),"$";
bufferinv db 1024 dup(?),"$"
taillebuff dw 1024
tailletmp dw 0
tailleASCII db 6 dup(?)
chainetmp db 6 dup(?)
sidep dw ?
ssi dw ?
separateur db " "
finchaine db "$"
dix dw 10
;---------------------------------------------------------------------------------------------------
; Code du Programme
;---------------------------------------------------------------------------------------------------
.CODE
debut:
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
;---Demande du nom de fichier
mov ah, 09h
lea dx, msgfi
int 21h
mov ah, 0Ah ;saisie de la chaine lu
lea dx, fichier
int 21h
mov al, fichier
mov newfi, al
lea si, fichier ;modification de la chaine pour remplacer txt par inv
lea di, newfi
boucle1:
mov al, [si]
mov [di], al
cmp al,'.'
je suite
inc di
inc si
jmp boucle1
suite:
inc di
mov al, 'i'
mov [di], al
inc di
mov al, 'n'
mov [di], al
inc di
mov al, 'v'
mov [di], al
xor bx, bx ;mettre bx à 0
mov bl, byte ptr[newfi+1] ;mettre dans bl le nombre d'octets lus au clavier
mov byte ptr [newfi+2+bx],0
xor bx, bx ;mettre bx à 0
mov bl, byte ptr[fichier+1] ;mettre dans bl le nombre d'octets lus au clavier
mov byte ptr [fichier+2+bx],0 ;ecrire un 0 deriere le nom de fichier
mov ah, 3Dh ;ouvrir le fichier de depart
lea dx, fichier+2 ;nom du fichier de depart
mov al, 2 ;mode d'acces = lecture seule
int 21h
jc existepas ; si CF=1, le fichier n'existe pas ou est inaccessible
mov handle1, ax ; recuperaton de la taille
MOV AH, 42h
MOV BX, handle1
MOV CX, 0
MOV DX, 0
MOV AL, 2
INT 21h
MOV taille1, AX
mov ah, 3fh
mov bx, handle1
mov cx, taille1
lea dx, buffer
int 21h
jc probleme
lea si, buffer
lea di, bufferinv
mov sidep, si
jmp lecture2b
probleme:
mov ah, 09h
lea dx, msgerr2
int 21h
jmp fin
existepas:
mov ah, 09h
lea dx, msgerr1
int 21h
jmp fin
lecture:
mov si, ssi
; inc si
mov sidep, si
inc si
lecture2b:
mov al, [si]
cmp al , separateur
je ecriture
mov al, [si]
cmp al, finchaine
je ecriture2
inc si
jmp lecture2b
ecriture:
mov ssi, si
; mov ah, 09h
; lea dx, msgver ;on affiche un message debug
; int 21h
ecritureb:
mov al, [si]
mov [di], al
cmp sidep, si
je lecture
dec si
inc di
jmp ecritureb
ecriture2:
mov ssi, si
; mov ah, 09h
; lea dx, msgver ;on affiche un message debug
; int 21h
ecriture2b: ;on ecrit buffer à l'envers dans bufferinv =>dec si et inc di
mov al, [si]
mov [di], al
cmp sidep, si
je finecriture
dec si
inc di
jmp ecriture2b
finecriture:
call convertion
mov ah, 09h
lea dx, msgtaille ;on affiche un message
int 21h
mov ah, 09h
lea dx, tailleASCII ;on affiche un message
int 21h
ecrirefichier:
mov ah, 3Ch ;creer le fichier d'arrivee
mov cx, 0
lea dx, newfi+2
mov al, 1 ;mode d'acces = ecriture seule
int 21h
mov handle2, ax
MOV AH, 40h
MOV BX, handle2
MOV CX, taille1
LEA DX, bufferinv ;on ecrit "taille" octets (taille du fichier de depart depuis le debut du buffer
INT 21h
suivant:
mov handle2, ax ; fermeture des 2 fichiers
mov ah, 3Eh
mov bx, handle1
int 21
mov ah, 3Eh
mov bx, handle2
int 21
mov ah, 09h
lea dx, msgfin ;on affiche le message de fin pour dire que tout c 'est bien passé
int 21h
jmp fin
fin:
mov ax, 4C00h ;on rend la main au dos
int 21h
;sous programme de convertion d un nombre 16 bits en ASCII
convertion PROC
STD
LEA DI, tailleASCII
ADD DI, 6
MOV AL, "$"
stosb
MOV AX, taille1
divise:
CMP AX, dix
MOV DX, 0
DIV dix
MOV BX, AX
MOV AX, DX
ADD AL, 48
stosb
MOV AX, BX
CMP AX,0
JA divise
ret
ENDP
end debut |
Partager