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

x86 32-bits / 64-bits Assembleur Discussion :

Afficher contenu binaire du registre eax


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut Afficher contenu binaire du registre eax
    Bonjour tout le monde!

    Je tente d'afficher le contenu binaire du registre eax.

    Pour ce faire, je souhaiterais que l'utilisateur puisse insérer n'importe quel nombre dans eax (un entier, un réel, un négatif entier, un négatif réel...).


    Pour commencer je parviens à afficher le contenu de mon registre en binaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    mov     ebx,eax
    mov     cx,32            ; 32 bits
     
    affiche:
    rcl     ebx,1            ; bit de gauche de EBX dans CF
    xor     al,al
    adc     al,48           ; 48 et CF pour obtenir le code ASCII
     
    mov     dl,al
    mov     ah,2
    int     21h             ; affiche le code ASCII
     
    loop    affiche
    Par contre, je ne sais pas comment convertir la chaîne de caractères entrée par l'utilisateur en valeur littérale...

    Quelqu'un saurait-il m'aiguiller ? =/

    Un grand merci d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonne soirée,
    Si j'ai bien compris votre question vous voulez convertir une suite de caractères (0..9) entrés au clavier en un nombre stocké dans la mémoire.
    Voilà comment !

    Supposons qu'on a entré le nombre : 229

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    229 = (50 - 48) * 10^2 + (50 - 48) * 10^1 + (57 - 48) * 10^0 = 2 * 100 + 2 * 10 + 9 * 1
    Pour chaque chiffre (caractère) :
    1. Soustraire 48
    2. Multiplier le résultat n fois par 10 avec n = le poids du chiffre dans le nombre

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut
    Très bien merci j'ai procédé comme suit.
    Par contre je rencontre un problème lors de l'affichage binaire de mon registre...


    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    afficher:
    mov 	ebx,valeur           ;valeur contient la valeur littéral du chiffre entré par l'utilisateur...
     
    mov     cx,32           	;32 bits
    affiche:
    rol    	ebx,1          	 	;bit de gauche de EBX dans CF  !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    mov		al,0
    adc     al,48          		;48 et CF pour obtenir le code ASCII
     
    mov     dl,al
    mov     ah,02h
    int     21h             	;affiche le code ASCII
     
    loop    affiche
    Je n'obtiens que des 0...

    Une petite idée ?

    Merci de votre aide!

  4. #4
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    L'instruction RCL figurant à ligne 6 dans le code a été remplacée par l'instruction ROL.

    Or, les instructions RCL et ROL sont différentes : elles font toutes deux une rotation, mais la première utilise le Flag Carry alors que la deuxième ne l'utilise pas.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut
    D'accord, cependant toujours le même problème.

    Par contre lorsque j'utilise
    au lieu de
    j'obtiens une autre réponse...

    Par exemple, si l'utilisateur entre 4:

    en utilisant xor al,al j'obtiens:
    00000000000000000000000000000000

    et en utilisant mov al, 0 j'obtiens:
    00000000000000000000110100000100

    Quelqu'un a-t-il une idée ?

  6. #6
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    C'est parce que l'instruction MOV AL,0 ne modifie pas le flag Carry, alors que l'instruction XOR AL,AL le modifie.

    Et comme ici le résultat est nul, le flag Carry est mis à 0.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut,
    J'ai pensé que le problème est avec la conversion des caractères entrées au clavier !!

    Dans votre code tu peut utiliser ROL ou RCL !

    J'ai essayé votre programme, c'est simple !

    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
     
    	.data
    line:   .byte 10
    	.bss
    	.lcomm tab, 32
    	.text
    	.global _start
     
    _start:
     
    	movl $9,  %eax 
    	movl $32, %ecx
    	movl $0, %esi
     
    convert:
    	rol  $1, %eax 	# ou rcl
    	jc cf_set	# JC : saut si retenue à 1 => CF = 1
     
    	movb $48, tab(%esi)
            jmp lop
     
    cf_set:
    	movb $49, tab(%esi)
     
    lop:
    	incl %esi
    	loop convert
     
    display:
    	movl $tab, %ecx
    	movl $32, %edx
    	movl $1,   %ebx
    	movl $4,   %eax
    	int  $0x80  
     
    newline:   
    	movl $line, %ecx
    	movl $1, %edx
    	movl $1,   %ebx
    	movl $4,   %eax
    	int  $0x80 
     
    exit:
    	movl $0, %ebx
    	movl $1, %eax
    	int  $0x80
    C'est en assembleur GNU !
    Je souhaite qu'il va vous aider !

    Bon chance !!
    Dernière modification par Invité ; 26/02/2013 à 21h59.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut
    Bonsoir,

    un grand merci pour votre aide vous m'avez tous beaucoup aidé!

    Mais je rencontre un dernier problème dans la représentation des réels... Ma technique est la suivante:


    1. je retiens l'emplacement de la virgule dans la chaîne de caractères,
    2. je traduis la chaîne de caractères en valeur littérale sans prendre la virgule en compte,
    3. je divise mon nombre obtenu par 10^décalement de la virgule.


    Le point 3 me pose problème. Je ne connais que l'instruction div pour exécuter une division. Or div ne fait que des divisions entières si je ne m'abuse...

    Auriez-vous une idée ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Salut,
    Je pense alors que tu devras utiliser le FPU de votre processeur !
    Pour la division avec virgule flottant on utilise l'instruction FDIV.
    Bonne chance.

  10. #10
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par issam.abdallah Voir le message
    Salut,
    Je pense alors que tu devras utiliser le FPU de votre processeur !
    Pour la division avec virgule flottant on utilise l'instruction FDIV.
    Bonne chance.
    Oui, mais pour que l'opération soit correcte, il faudrait que les 2 nombres: mantisse/dividende et exponentielle/diviseur soient déjà en représentation virgule flottante, même si leur valeur numérique se trouve égale à un entier. Non ? Sinon, même en les chargeant dans des registres dédiés (FP0...8), le processeur va simplement 'caster' en flottant des nombres dont la valeur n'a de sens qu'en tant que représentation d'entier (en même de naturel, ici, en fait).

    Je n'ai aucune idée de la façon habituelle de construire la représentation d'un nombre en virgule flottante, à partir de sa représentation textuelle, mais en asm ça doit être coton ! Il faudrait déjà voir à quoi ça ressemble dans les bibliothèques de compilos, donc en C la plupart du temps (et ça pour une implantation simple d'un langage de prog, vaut mieux pas aller voir dans gcc sinon tu te tires une balles, avec les empilages de #ifdef et compagnie pour toutes les plate-formes cibles, sans parler des optimisations omni-présentes qui rendent le code indéchifrable...).

    Si quelq'un trouve une implantation simple et claire de ce genre de choses en asm, je suis preneur, ça me servira.

    @stoner : je suis intéressé, déjà, par ta routine de décodage d'une entrée de nombre entier (même non-signé), si tu veux bien la publier. C'est déjà ça de gagné

    Denis

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut
    Finalement mon professeur vient de m'indiquer qu'il suffit d'introduire le nombre à la dur pour l'exercice...


    Je posterai mon code mercredi (après la remise du tp pour éviter le plagiat... ^^) Sinon je peux d'ores et déjà te l'envoyer par mp Denispir ?

    Dans tous les cas un immense merci pour votre aide! Je passerai le post en résolu mercredi.

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut
    Désolé pour le temps d'attente...

    Voici le code:

    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
    .MODEL small,stdcall
    .STACK 4096
    .386
     
    .DATA
    enonce			db "Veuillez introduire un nombre ENTIER:",13,10,"$"	
    fauxCara		db "Un caractere est invalide.",13,10
    				db "Si vous tentez d'introduire un reel dans EAX, veuillez passer par le code.$"			
     
    nombre  		db 100 dup (?)
    taille 			dw 0
    valeur			dd 0
    dixExpo			dd 1
    decalage		dw 3	
     
     
    .CODE
    main proc
     
    mov 	ax,@data
    mov 	ds,ax
    mov 	es,ax 
     
     
    debut:						
    mov 	ah, 09h
    mov 	dx, offset enonce
    int 	21h					;Enoncé
     
     
    mov 	ah, 3Fh				;Saisi du nombre sous chaîne de caractères
    mov 	bx, 0
    mov 	cx, 100
    mov 	dx, offset nombre
    int 	21h
    mov 	taille, ax
     
     
    iteration:	
    mov 	bx,offset nombre	;Déplacement de l'offset jusqu'au dernier caractère
    add 	bx,taille
    sub 	bx,decalage
     
     
    mov		eax,0
    mov		bl,[bx]
    mov		al,bl				
    cmp		al,'-'				;Vérification négation
    je		verifNegation
     
     
    sub 	bl,48				;Conversion ASCII => VALEUR LITERALE
     
     
    mov 	al,bl				;Vérification du caractère
    cmp 	al,0
    jb		erreurCara
    cmp 	al,9
    ja 		erreurCara
    jmp		suite
     
     
    verifNegation:				;Vérification de la négation
    mov 	bx,decalage
    cmp		bx,taille
    je		conversionNegatif
     
     
    erreurCara:
    mov 	ah, 09h				
    mov 	dx, offset fauxCara
    int 	21h					;Affiche message d'erreur
    jmp 	fin
     
     
    suite:						;Constitution du nombre
    mov 	ebx,eax
    mov 	eax,dixExpo
    mul 	ebx
    add 	valeur,eax 
     
     
    mov 	eax,10				;multiplie dixExpo par 10
    mov 	ebx,dixExpo
    mul 	ebx
    mov 	dixExpo,eax
     
     
    mov 	ax,decalage			;Boucle
    cmp 	ax,taille
    je 		afficher
    inc 	decalage			;Pour reculer l'offset de 1 lors de l'itération
    jmp 	iteration
     
     
    conversionNegatif:
    mov 	eax,-1				;multiplie valeur par -1
    mov 	ebx,valeur
    mul 	ebx
    mov 	valeur,eax
     
     
    afficher:
    mov     cx,32           	;32 bits
     
     
    ;INSERER UNE CONSTANTE A LA DUR A LA PLACE DE VALEUR POUR TESTER UN REEL
     
     
    affiche:
    rcl    	valeur,1          	;bit de gauche de valeur dans CF
    mov		dl,0
    adc		dl,48
    mov     ah,02h
    int     21h             	;affiche le code ASCII
     
    loop    affiche
     
     
    fin:						;Fin du programme
    mov 	ah, 4Ch
    mov 	al, 0
    int 	21h
     
    main ENDP
    END main
    Je passe en résolu !

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

Discussions similaires

  1. Comment afficher le contenu d'un registre ?
    Par Midou45 dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 16/05/2008, 05h50
  2. [ImageMagick] imagegif m'affiche le contenu binaire de l'image
    Par Anduriel dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 07/10/2005, 18h16
  3. [process] Afficher contenu gestionnaire des tâches
    Par keny dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/07/2005, 17h56
  4. Afficher le contenu d'un registre
    Par duplo dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/11/2004, 12h33
  5. Afficher le contenu d'un registre
    Par mikevador02 dans le forum Assembleur
    Réponses: 10
    Dernier message: 23/06/2003, 18h18

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