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
|
%macro afficher_message 2
mov eax,4
mov ebx,1
mov ecx,%1
mov edx,%2
int 80h
%endmacro
%macro ecrire_dans_variable 2
mov eax,3
mov ebx,0
mov ecx,%1
mov edx,%2
int 80h
%endmacro
%macro atoi 2
mov esi, %1
xor eax, eax
xor edx, edx
%%loop:
mov dl, byte [esi] ; on recupere le caractere du chiffre courrant dans edx
cmp dl, 10 ; si dl contient un retour chariot on a fini de traiter la chaine
je %%finish
lea eax, [eax * 4 + eax] ; eax = eax * 5
add eax, eax ; eax = eax + eax, donc a l'arrivee on a multiplie eax par 10 avec ces deux lignes
add esi, 1 ; on incremente le pointeur sur la chaine pour passer au chiffre suivant
and dl, 0x0F ; c'est une astuce pour recuperer la valeur decimale du chiffre, ca s'explique par la representation binaire, on aurait pu faire un sub 48 a la place
add eax, edx ; on additionne la valeur du chiffre a eax (qui a ete multiplie par 10 avant remember ?)
jmp %%loop ; et on boucle
%%finish:
mov [%2], eax
%endmacro
%macro itoa 3
mov eax, [%1] ; on recupere le nombre la ou il est stocke
mov edi, %2 ; on recupere l'adresse du buffer de destination
mov ebx, 10 ; diviseur = 10
xor ecx, ecx
%%first_loop:
xor edx, edx
div ebx ; on divise eax par 10, le quotient va dans eax, le reste va dans edx
push dx ; on stocke le reste, sachant qu'en divisant par 10 a chaque fois on stocke les chiffres dans l'ordre inverse -> 3,2,1
inc cl ; longueur (de la chaine) = longueur + 1
test eax, eax ; tant que eax != 0, c'est a dire tant que qu'il y a un quotient qu'on peut diviser et nous donner un reste
jnz %%first_loop
mov [%3], ecx ; ecx contient la longueur de la chaine, on stocke la valeur pour pas la perdre
%%second_loop: ; la seconde boucle permet de convertir decimal -> ascii en ajoutant 48, et de remettre les chiffre dans l'ordre attendu (grace aux pop)
pop ax ; donc on recupere le dernier chiffre traite
or al, 00110000b ; on lui ajoute 48 (la encore c'est un peu astucieux)
mov byte [edi], al ; et on le stocke dans le buffer de destination, de gauche a droite donc dans l'ordre -> "123"
inc edi
loop %%second_loop ; jusqu'a ce que ecx = 0, c'est a dire qu'on ait traite toute la chaine
mov byte [edi], 0
%endmacro
%macro itob 1
mov cl,1
mov ax,%1
binaire:
cmp cl,16
jg fin
rcl ax
ja zero
un:
afficher_message 49,1
jmp compteur
zero:
afficher_message 48,1
compteur:
inc cl
jmp binaire
fin:
%endmacro
section .text
global _start
_start:
afficher_message msg,msgl
ecrire_dans_variable nb_str,10
atoi nb_str, nb_dec
itob nb_dec
end:
mov eax,1
mov ebx,0
int 80h
section .data
msg: dw "Saisissez un nombre:",10,13
msgl: equ $ - msg
msgprem: dw "est premier",10,13
msgpreml: equ $- msgprem
msgnprem: dw "n'est pas premier",10,13
msgnpreml: equ $- msgnprem
section .bss
nb_str: resw 1
nb_dec: resw 1
sum_str: resw 2
sum_dec: resw 2
sum_len: resw 1 |
Partager