1: ; /// -------------------------------------------------------------------------
2: ; /// Convertie une pile de caractères ASCII en un nombre décimal.
3: ; /// Le premier élément de la pile indique si le nombre est négatif,
4: ; /// le deuxième élément est le nombre de caractères, le troisième
5: ; /// est un pointeur (*) sur un drapeau pour retourner une erreur et
6: ; /// chaque élément suivant est un caractère représantant un chiffre
7: ; /// d'un nombre de droite à gauche.
8: ; /// Exemple: -123 = |1|3|*|3|2|1|
9: ; /// 12333 = |0|5|*|3|3|3|2|1|
10: ; /// -------------------------------------------------------------------------
11: title MASM Conversion ASII décimal (convertirNombre.asm)
12: .486
13: .model flat
14:
15: .data
16: multiplicateur dword 10 ; multiplicateur pour valeur décimale
17: chiffre dword 0 ; chiffre converti
18: nombre dword 0 ; nombre converti
19: position dword 0 ; position du chiffre
20: iteration dword 0 ; iteration lors de multiplication x10
21: nombreNegatif dword 0 ; si le nombre est négatif
22: erreurAdresse dword 0 ; pointeur sur le drapeau d'erreur
23:
24: .code
25: public _convertirNombre ; rendre la procédure publique
26: _convertirNombre proc
27: push ebp ; sauvagarder ebp sur la pile
28: mov ebp, esp ; mettre l'adresse du pointeur de pile dans ebp
29: push ebx ; sauvegarder ebx
30: push ecx ; sauvegarder ecx
31: push esi ; sauvegarder esi
32: mov esi, ebp ; pointer esi sur la pile
33:
34: add esi, 8 ; obtenir l'adresse du drapeau négatif
35: mov ebx, [esi] ; si le nombre est négatif
36: mov nombreNegatif, ebx ; assigner le drapeau nombre négatif
37: add esi, 4 ; obtenir l'adresse du nombre de chiffre
38: mov ecx, [esi] ; nombre de chiffres du nombre
39: add esi, 4 ; obtenir l'adresse du drapeau d'erreur
40: mov ebx, [esi] ; copier adresse
41: mov erreurAdresse, ebx ; assigner l'adresse dans une variable
42:
43: mov eax, 4 ; nombre d'octets par élément de pile
44: mul ecx ; multiplié par le nombre de chiffres sur la pile
45: add esi, eax ; avancer au bout de la pile de nombre
46: mov eax, 0 ; initialiser le nombre a 0
47: preVal:
48: cmp ecx, 10 ; prévalidation pour les nombre > 10 caractères
49: ja erreurConv ; sauter s'il c'est le cas
50:
51: prochainChiffre:
52: mul multiplicateur ; multiplier par 10 (shl décimal 1 gauche)
53: jo erreurConv ; vérifier un dépassement dans le signe
54: jc erreurConv ; vérifier un dépassement dans la retenue
55: mov ebx, [esi] ; obtenir le caractère du chiffre
56: and ebx, 0Fh ; convertir en valeur numérique (-48)
57: add eax, ebx ; cumuler le nombre
58: jo erreurConv ; vérifier un dépassement dans le signe
59: jc erreurConv ; vérifier un dépassement dans la retenue
60: sub esi, 4 ; obtenir l'adresse du prochain chiffre
61: loop prochainChiffre ; passer au prochain chiffre
62:
63: cmp nombreNegatif, 0 ; si c'est un nombre négatif
64: je finConv ; si non, sauter à la fin
65: neg eax ; complément à deux
66: jmp finConv ; sauter à la fin
67:
68: erreurConv:
69: mov eax, 0 ; retourner le nombre 0
70: mov [erreurAdresse], 1 ; signaler une erreur de conversion
71: finConv:
72: pop esi ; restaurer esi
73: pop ecx ; restaurer ecx
74: pop ebx ; restaurer ebx
75: pop ebp ; restaurer ebp
76: ret ; retourner à l'appelant
77: _convertirNombre endp
78: end