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 :

[8086] Affichage d'un entier de 32 bits


Sujet :

Assembleur

  1. #1
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [8086] Affichage d'un entier de 32 bits
    avé

    je voudrais savoir comment s y prendrepour afficher un entier de 32 bits en decimal! sans utiliser les registre 32 bits !!


    thanx!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    quel os ? sous quelle forme se présente l'entier avant d'etre affiché ?

  3. #3
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut Code
    Le code n'est peut être pas parfait mais il marche en 16 bits. A toi d'adapter...

    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
     
    AfficheDEC PROC near
    	; paramètre : ax = nombre à afficher
    	mov si,0 ; initialise le nombre de caractère qui compose nb à 0
    	mov cl,10
    lbl2:
    	div cl ; divise ax par cl : résultat dans al et reste dans ah
    	mov dl,ah
    	add dl,48 ; ajoute 48 pour obtenir le code ASCII du nombre
    	inc si ; incrémente le compteur de nombre
    	push dx ; met le si-ième chiffre dans la pile
    	cmp al,0 ; si al égal à 0, on sort de la boucle
    	je fin2
    	mov ah,0
    	jmp lbl2
    fin2:
    	cmp si,0
    	je fin3
    	pop dx
    	mov ah,2
    	int 21h
    	dec si
    	jmp fin2
    fin3:	
    	ret
    AfficheDEC endp
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  4. #4
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    adapter en 32 bits!! C ca le prob ....vu ke linstructrion div met le reste de division dans DX , on ne peu pas utiliser un operande 32 bits ( DX:AX )!! non?

    Blustuff dit:
    sous quelle forme se présente l'entier avant d'etre affiché ?
    moi pas comprendre Kestion!

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par elNINIo
    adapter en 32 bits!! C ca le prob ....vu ke linstructrion div met le reste de division dans DX , on ne peu pas utiliser un operande 32 bits ( DX:AX )!! non?
    si l'opérande de div est sur 8 bits c'est AX qui est divisé
    si l'opérande de div est sur 16 bits c'est DX:AX qui est divisé
    si l'opérande de div est sur 32 bits c'est EDX:EAX qui est divisé...voila la réponse a ta question

    sinon voici le code ke j'utilise pour afficher des nombres en decimal...c'est sans doute pas le meilleur mais ca marche


    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
     
    .386
    ;------------------------SEGMENT DE DONNEES-------------------------
    ;-------------------------------------------------------------------
    _data segment public
    _data ends
    ;-------------------------------------------------------------------
     
     
    ;------------------------SEGMENT DE CODE----------------------------
    ;-------------------------------------------------------------------
    _code segment public
    	assume cs:_code, ss:_stack
     
    	START:
    		mov	ax, _data	;synchronise les segments data et ds
    		mov	ds, ax
     
    		mov	eax, 0FFFFFFFFh
    		call	AFFICHER_EAX_DEC
     
    		mov	ax, 4C00h
    		int	21h
     
     
    	AFFICHER_AL_DEC:		;affiche une valeur comprise entre 0 et 255 contenue dans AL
    		push	cx bx ax
    			xor	bh, bh
    			mov	bl, 64h 			;100 en dec
    			xor	cl, cl
    			boucle1:
    				xor	ah, ah
    				div	bl
    				;test pour ne pas afficher les zéros de devant
    				or	cl, al
    				cmp	cl, 0
    				je	nepasafficherzero1				
    					push	ax
    						add	al, 30h		;48 en dec, cette addition permet d'obtenir un code ASCII
    						mov	ah, 0Eh
    						int	10h
    					pop	ax
    				nepasafficherzero1:
    				cmp	bx, 1
    				je	finboucle1
    				push	ax
    					xor	ah, ah
    					mov	al, bl
    					mov	bl, 0Ah		;pour diviser par 10 soit 0A
    					div	bl
    					mov	bl, al
    				pop	ax
    				mov	al, ah
    				jmp	boucle1
    	finboucle1:
    		cmp	cl, 0
    		jne	fin1
    		mov	ax, 0E30h
    		int	10h
    		fin1:
    		pop	ax bx cx
    		ret
     
     
    	AFFICHER_AX_DEC:		;affiche une valeur comprise entre 0 et 65535 contenue dans AX
    		push	dx cx bx ax
    			mov	bx, 2710h 			;10000 en dec
    			xor	cl, cl
    			boucle2:
    				xor	dx, dx
    				div	bx
    				;test pour ne pas afficher les zéros de devant
    				or	cl, al
    				cmp	cl, 0
    				je	nepasafficherzero2
    					push	ax	
    						add	al, 30h		;48 en dec
    						mov	ah, 0Eh
    						int	10h
    					pop	ax
    				nepasafficherzero2:
    				cmp	bx, 1
    				je	finboucle2
    				push	ax dx
    					xor	dx, dx
    					mov	ax, bx
    					mov	bx, 000Ah	;pour diviser par 10 soit 000A
    					div	bx
    					mov	bx, ax
    				pop	ax			;je récupère dx dans ax
    				inc	sp			;j'incrémente de 2 sp pour compenser le push ax d'avant
    				inc	sp
     
    				jmp	boucle2
    	finboucle2:
    		cmp	cl, 0
    		jne	fin2
    		mov	ax, 0E30h
    		int	10h
    		fin2:
    		pop	ax bx cx dx
    		ret
     
    	AFFICHER_EAX_DEC:		;affiche une valeur comprise entre 0 et 4'294'967'295 contenue dans AX
    		push	edx cx ebx eax
    			mov	ebx, 3B9ACA00h 			;1000000000 en dec
    			xor	cl, cl
    			boucle3:
    				xor	edx, edx
    				div	ebx
    				;test pour ne pas afficher les zéros de devant
    				or	cl, al
    				cmp	cl, 0
    				je	nepasafficherzero3
    					push	eax
    						add	al, 30h	;48 en dec
    						mov	ah, 0Eh
    						int	10h
    					pop	eax
    				nepasafficherzero3:
    				cmp	bl, 1
    				je	finboucle3
    				push	eax edx
    					xor	edx, edx
    					mov	eax, ebx
    					mov	ebx, 0000000Ah	;pour diviser par 10 soit 000A
    					div	ebx
    					mov	ebx, eax
    				pop	eax edx			;je récupère edx dans eax et eax dans edx
     
    				jmp	boucle3
    	finboucle3:
    		cmp	cl, 0
    		jne	fin3
    		mov	ax, 0E30h
    		int	10h
    		fin3:
    		pop	eax ebx cx edx
    		ret
     
     
    _code ends
    ;--------------------------------------------------------------------
     
     
     
     
    ;------------------------SEGMENT DE LA PILE--------------------------
    ;--------------------------------------------------------------------
    _stack segment stack
    	db 100h dup (?)			;déclare une pile de 256 octets
    _stack ends
    ;--------------------------------------------------------------------
     
     
     
     
    ;------------------------SAUT AU DEBUT DU PROGRAMME------------------
    	end start
    ;--------------------------------------------------------------------
    ++

  6. #6
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    VOILA !!! mnt c plus faccile de comprendre mon prob...G PAS LE DROIT dutiliser les registre 32 bits ....c a d EAX , EDX

    eh

  7. #7
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    En fait c'est pas plus difficile qu'avec un nombre de 16 bits !

    - Tu stockes ton nombre de 32 bits dans la paire DX:AX.
    - Tu utilises l'instruction DIV (ou IDIV si les nombres sont signés) pour diviser par 10 autant de fois qu'il le faut, afin d'obtenir les chiffres de l'entier un à un. Ne pas oublier qu'après chaque division, DX et AX sont remplis avec les résultats : il faut donc penser à faire les sauvegardes nécessaires.

    Tout se passe exactement comme si le nombre faisait 16 bits, mis à part le fait que le nombre 10 (le diviseur) doit être codé en 16 bits et non en 8 bits (sans quoi c'est AX qui sera le dividande et non DX:AX).

    A+

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    pour moi ce qui me parait problematique, c'est que le resultt de la division doit tenir sur 16 bits, sans quoi l'int 0 est appellée.

  9. #9
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Blustuff
    pour moi ce qui me parait problematique, c'est que le resultt de la division doit tenir sur 16 bits, sans quoi l'int 0 est appellée.
    Exact, je n'avais pas pensé à ça.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Si les nombres a afficher n'otn que 8 chiffres le problème est résolu. une fait une première division par 10000 le maximum du quotient étant 9999 ce qui tiens sur 16 bits, on peut donc afficher le nombre en deux parties. Pour les nombres a 9 chiffres, je crois qu'il faut revenir a la division binaire. Un post existe a ce sujet avec les expliquations de AMILIN.

  11. #11
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    ok thanx....mé jaurais du etre + explicite d le 1ier message...car je lsi ici tt ce a koi g pensé avant de demander votre aide!!

    é jpourrais avoir l'@ du poste de AMILIN?


  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696

  13. #13
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    merciiiiiii... ...je v pouvoir terminer mon prog!!!
    ReMerciiiiiii

    :o

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage 0 devant entier
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/12/2005, 11h47
  2. Erreur d'affichage d'un entier
    Par LEK dans le forum C++
    Réponses: 1
    Dernier message: 14/10/2005, 16h34
  3. Insérer un entier sur 64 bits dans une base ?
    Par DJZiaK dans le forum SQLite
    Réponses: 1
    Dernier message: 10/05/2005, 18h37
  4. affichage selon valeur entiere ou decimale
    Par Ankya dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 04/05/2005, 11h36
  5. entiers de 64 bits
    Par jmv dans le forum C++
    Réponses: 11
    Dernier message: 15/09/2004, 21h52

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