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?
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?
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.
super!!
Tout est reglé!
voici ce que ca donne
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
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
Evidemment que c'est du code tres laid mais en tant que debutant je m'en contenterai
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
Merci et a bientot!!!![]()
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
Partager