IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

[TASM] Comment coder Hamming !


Sujet :

Assembleur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [TASM] Comment coder Hamming !
    voici mes info système puisqu'elle sont demandées :
    ------------------
    System Information
    ------------------
    Time of this report: 11/29/2006, 14:49:38
    Machine name: PC203-01
    Operating System: Windows XP Professional (5.1, Build 2600) Service Pack 2 (2600.xpsp_sp2_gdr.050301-1519)
    Language: French (Regional Setting: French)
    System Manufacturer: AWARD_
    System Model: AWRDACPI
    BIOS: Phoenix - AwardBIOS v6.00PG
    Processor: Intel(R) Pentium(R) 4 CPU 3.00GHz (2 CPUs)
    Memory: 480MB RAM
    Page File: 292MB used, 830MB available
    Windows Dir: C:\WINDOWS
    DirectX Version: DirectX 9.0c (4.09.0000.0904)
    DX Setup Parameters: Not found
    DxDiag Version: 5.03.2600.2180 32bit Unicode
    Bon, je pose une grosse question pour mon premier post !
    Je dois programmer le code vérificateur de hamming (avec TASM).
    il faut créer des exécutables (.exe et non .com) : l'un va prendre une phrase au clavier et exécuter hamming et l'autre va la vérifier avec le code de parité transmis.
    Il y a des erreurs, je sais, mais voici ce que j'ai pu trouver (avec l'aide de quelques potes qui sont aussi bloqués que moi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Quelqu'un pourrait-il m'aider car là je (enfin moi et toute ma classe lol) patauge complètement.

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut

    Tu ne t'imagines tout de même pas qu'on va se farcir tout ton code pour le déboguer à ta place, non ?

    À la rigueur, tu nous expliques ce qui coince & comment, où ça coince & ce que tu attendais, puis tu nous donnes la partie de code correspondante, mais tu dois avoir fait le reste du travail de recherche de panne avant.

    Merci.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

Discussions similaires

  1. [C#] Comment coder un String.Join pour des int ?
    Par luimême dans le forum C#
    Réponses: 2
    Dernier message: 12/10/2005, 08h14
  2. [matrice spéciale] comment coder ce genre de matrices?!
    Par wjean dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 09/05/2005, 09h50
  3. Comment coder un effet de neige ?
    Par the_magik_mushroom dans le forum Langage
    Réponses: 11
    Dernier message: 17/12/2004, 23h29
  4. Comment coder une tabulation pour cut ?
    Par ggnore dans le forum Linux
    Réponses: 2
    Dernier message: 26/11/2004, 10h31
  5. Comment coder guillemets et cotes ?
    Par Vow dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 14/05/2003, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo