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 :

ECX en valeur ASCII


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut ECX en valeur ASCII
    J'aurais besoin de convertir la valeur contenu dans ecx en sa valeur ascii
    exemple:

    ecx = 00000010
    jaurais besoin de 30 30 30 30 30 30 31 30

    Quelqu'un peut m'aiguiller sur la facon de s'y prendre?

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Un registre 32 bits est composé de 8 nibbles (1 nibble est un paquet de 4 bits). Chaque chiffre d'un registre tient donc sur un nibble.

    Par exemple : ECX = 12345678

    8 tient sur 4 bits, de même que 7, 6 , etc.

    Pour convertir il suffit donc de :

    1) Décaler le nombre dans le registre vers la gauche de la taille d'un nibble (instruction ROL) et sauvegarder ce résultat.

    Ex : 12345678 devient 2345681

    2) Faire un 'ET' binaire (AND) de la taille d'un nibble sur le décalage précédent.

    Ex : 23456781 devient 1

    3) Deux possibilités :

    3-A) Utiliser une lookup table.
    3-B) Convertir en ajoutant les valeurs ASCII.

    Pour 3-B, sachant que les chiffres convertit en ASCII vont de 0x30 à 0x39 et les lettres 'A' à 'F' vont de 0x41 à 0x46.

    - Si le chiffre obtenu à l'étape 2) est inférieur ou égal à 9, on ajoute 0x30 (soit "0").
    - Si le chiffre obtenu à l'étape 2) est strictement supérieur à 9 on ajoute 0x31 (soit "A" - 10 ).

    Ex : 1 devient "1" (soit 1 + 0x30)

    4) on sauve le résultat de la conversion dans une chaîne (un tampon vide au départ).

    5) On répète l'opération 8 fois ( 8 nibbles dans 32 bits) en tout et recommençant à l'étape 1). Il suffit d'utiliser un compteur pour cela.

    En reprenant à l'étape 1) on travaillera sur la sauvegarde effectuée (soit 2345681 dans l'exemple).

    --------

    Voilà, tu as toutes les étapes, essaye de coder quelque chose et nous [je parle des participants du forum] essayerons de te corriger si besoin est.

    Essaye de transcrire les étapes précédents en pseudo-langage avant de commencer à écrire le bout de programme.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut Resolu
    super!!

    Tout est reglé!

    voici ce que ca donne

    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
     
    			push eax
    			push ebx
    			mov ebx, ecx // copie du compteur
    			push ecx
    			push edx
     
    			xor edx, edx
    			mov eax, ebx
    			mov ecx, 0xF
    			div ecx
    			add ebx, eax
    			xor ecx, ecx
     
    			add edi, 0x6
    boucleAddress:
    			mov edx, ebx // copie de l'original
    			shr bl, 0x4
    			push eax
    			xor eax, eax
    			mov al, bl
    			call compare
     
    			pop eax
    			shl bl, 0x4
    			xor bl, dl
    			mov al, bl
    			inc edi
    			call compare
     
    			shr ebx, 0x8
     
    			inc ecx
    			sub edi, 0x3
    			cmp ecx, 0x4
    			jne boucleAddress
    et

    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
     
    compare:
    			cmp eax, 0x9
    			ja above
     
    			// pas plus grand que 9
    			push ebx
    			mov ebx, eax
    			add ebx, 0x30
    			mov [edi], bl
    			pop ebx
    			jmp endCompare
    above:		// plus grand que 9
    			push ebx
    			mov ebx, eax
    			add ebx, 0x37
    			mov [edi], bl
    			pop ebx
    endCompare:
    			ret
    Evidemment que c'est du code tres laid mais en tant que debutant je m'en contenterai

    Merci et a bientot!!!

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    voilà exemple (MASM 32-bits) utilisant une "lookup table". Ca n'est pas forcément le plus rapide, mais c'est assez condensé.

    - Le chiffre à convertir est dans EDX.
    - La chaîne où est mis le chiffre convertit (en chaîne donc) est pointée par EDI.

    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
     
    .686
    .model flat, stdcall  ;32 bit memory model
    option casemap :none  ;case sensitive
     
    .data
    Tab BYTE "0123456789ABCDEF",0
    chaine BYTE 9 dup (0)
     
    .code
     
    start:
    	mov edx, 12345678h ;chiffre à convertir
     
    	mov ebx, offset Tab
    	mov edi, offset chaine
    	mov ecx, 8	
     
    @convert:
    	rol edx, 4
    	mov eax, edx
    	and eax, 0Fh
    	xlat
    	mov byte ptr [edi], al
    	inc edi
    	dec ecx
    	jnz @convert
     
    	;edi pointe sur la chaine "12345678"
    end start

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

Discussions similaires

  1. Comparaison de lettres avec valeur ASCII
    Par Vince dans le forum C++
    Réponses: 4
    Dernier message: 04/03/2009, 11h20
  2. Valeur ASCII d'une chaine, fct atoi() ?
    Par Freud44 dans le forum C++
    Réponses: 7
    Dernier message: 23/02/2009, 16h18
  3. Comment récuperer la valeur ASCII d'un caractère ?
    Par El-Diablo- dans le forum C++Builder
    Réponses: 9
    Dernier message: 05/03/2007, 18h11
  4. Réponses: 25
    Dernier message: 08/03/2006, 17h03
  5. Valeur Ascii d'un AnsiString
    Par neness dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/02/2004, 09h00

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