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 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
| .386
donnees segment para public use16
SFichier STRUC
nom db 64 dup(0)
handle dw ?
SFichier ENDS
f_in SFichier <'in.txt',?>
buffer db 31 dup(?)
taille dw ?
msg_Erreur1 db 'Erreur ouverture in.txt','$'
msg_Erreur2 db 'Erreur lecture in.txt','$'
msg_Erreur3 db 'Erreur fermeture fichier','$'
chaine db ?
hemming db ? ;bits de controle de hemming
indice db ?
port_com equ 0 ;numéro port com 1
param_connexion equ 11100011b ;paramètres de la connexion
donnees ends
code segment para public use16
assume cs:code,ds:donnees
debut:
mov ax,donnees
mov ds,ax
call Init_connexion
call Ouvrir_fichier
call Lire_donnees
tant_que:
cmp taille,0
je fin_tant
call Test_taille_buffer ;si taille buffer<30 -> rempli le reste avec des
0
call Calculer_Hemming
call Send_donnees
call pause
call Lire_donnees
jmp tant_que
fin_tant:
call Envoi_eof
call Fermer_fichier
Fin:
mov ax,4C00h
int 21h ;quitte
;----------------------------------------------------
Calculer_Hemming:
; ah=données (8bit)
; al=1 bit de donnée
; bl=indice (indice pour hemming)
; dl=compteur pour1
; dh=compteur pour2
; utilise cl pour les shr
;initialisation des variables
mov byte ptr hemming,0
mov bl,2 ;indice pour hemming
mov dl,0 ;compteur1
mov si,0 ;si est utilisé pour se déplacer dans le buffer
CH_pour1:
cmp dl,30 ;30 octets = 30*8 bits
jge CH_fpour1
mov ah,byte ptr buffer[si]
inc si
mov dh,0 ;compteur2
CH_pour2:
cmp dh,8
jge CH_fpour2
;calcul indice
inc bl
;si indice=puissance de 2 -> indice++
mov indice,bl
call test_indice_puissance_de_2
jnz CH_continue
inc bl
CH_continue:
;prendre un bit de ah et le placer dans al
mov al,ah
mov cl,7
sub cl,dh ;cl=nombre de shr à effectuer
shr al,cl
and al,1 ;masque pour ne garder que le dernier bit
call Modifier_bits_hemming
inc dh
jmp CH_pour2
CH_fpour2:
inc dl
jmp CH_pour1
CH_fpour1:
ret
;----------------------------------------------------
test_indice_puissance_de_2:
;compte le nombre de 1 de indice
;méthode: on calcule dans bl le nombre de 1 qu'il y a dans indice
; si bl=1 -> indice est une puissance de 2
; puis on soustrait 1 de bl
;résultat: zf=1 si indice est une puissance de 2
push ax
push bx ;sauvegarde ax et bx sur la pile
mov bh,0 ;compteur
mov bl,0 ;resultat
mov al,indice
TI_boucle:
mov ah,1
and ah,al
add bl,ah
shr al,1
inc bh
cmp bh,8
jne TI_boucle
dec bl ;place le zf
pop bx
pop ax ;récupère ax et bx
ret
;----------------------------------------------------
Modifier_bits_hemming:
cmp al,1
jne MBH_fin
xor hemming,bl ;hemming+=indice
MBH_fin:
ret
;----------------------------------------------------
Test_taille_buffer:
;si taille<30 -> rempli le reste du buffer avec des 0
cmp taille,30
je TTB_fin
mov si,taille
mov cx,30
sub cx,taille ;cx=nbre de passage dans la boucle
TTB_boucle:
mov byte ptr buffer[si],00h
inc si
loop TTB_boucle
TTB_fin:
ret
;----------------------------------------------------
Init_connexion:
mov ah,00
mov al,param_connexion
mov dx,port_com
int 14h
ret
;----------------------------------------------------
;envoi 31 octet (30 octet de données + 1 octet de controle)
;via le port com
Send_donnees:
mov cx,1 ;compteur
mov si,0 ;indice dans le buffer
SD_pour:
cmp cx,30
jg SD_fpour
mov bl,byte ptr buffer[si]
inc si
call Send_carac
inc cx
jmp SD_pour
SD_fpour:
mov bl,hemming
call Send_carac
ret
;----------------------------------------------------
;Envoi d'un caractère
;in: bl=caractère a envoyé
Send_carac:
push ax
push dx
mov ah,01
mov al,bl
mov dx,port_com
int 14h
pop ax
pop dx
ret
;----------------------------------------------------
pause:
pusha
mov ecx,0
P_boucle:
add ecx,1
pusha
popa
cmp ecx,0FFFFFh
jb P_boucle
popa
ret
;----------------------------------------------------
Envoi_eof:
;Envoi le caractère FF pour signifier la fin au programme receveur
call pause
call pause
call pause
mov bl,0FFh
call send_carac
call pause
call pause
ret
;----------------------------------------------------
Ouvrir_fichier:
;ouvre le F_in en lecture
mov ax,3D00h
mov dx,offset f_in
int 21h
jc Erreur1
mov f_in.handle,ax ;place le handle dans la structure
ret
;----------------------------------------------------
Lire_donnees:
mov ax,3F00h
mov bx,f_in.handle
mov cx,30
mov dx,offset buffer
int 21h
jc Erreur2
mov taille,ax
ret
;----------------------------------------------------
Fermer_fichier:
mov ah,3Eh
mov si,offset f_in
mov bx,word ptr [si].handle
int 21h
jc Erreur3
ret
;----------------------------------------------------
Erreur1:
;affiche un message d'erreur et quitte
mov dx,offset msg_Erreur1
mov ax,0900h
int 21h ;affiche erreur
jmp Fin
;----------------------------------------------------
Erreur2:
mov dx,offset msg_Erreur2
mov ax,0900h
int 21h ;affiche erreur
jmp Fin
;----------------------------------------------------
Erreur3:
mov dx,offset msg_Erreur3
mov ax,0900h
int 21h ;affiche erreur
jmp Fin
;----------------------------------------------------
code ends
pile segment stack
db 100 dup (?)
pile ends
end debut |
Partager