Bien le bonjour !!
j essaie (avec nasm sous Linux) de coder la conversion d une chaine ascii vers un nombre et inversement :
utilisant les fonctions :
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 chaine_vers_nb: ; rbp : adresse chaine ; resultat(r15) contiendra le nombre !! mov rsi, rbp call est_un_nombre cmp booleen, 1 ; pas nombre ? je fin_nb mov rsi, rbp call calcul_taille ; rdx : taille chaine (sans NULL) xor resultat, resultat mov multiple, 1 xor rbx, rbx xor rax, rax boucle_nb: cmp rdx, 0 ; fin de la chaine ? jle fin_nb dec rdx mov byte bl, [rbp + rdx] ; char sub bl, 48 ; char - nb mov rax, bl ; rax * multiple mul multiple ; add resultat, rax ; resultat += chiffre * multiple mov rax, 10 ; multiple mul multiple ; = multiple * 10 mov multiple, rax ; jmp boucle_nb fin_nb: ret nb_vers_chaine: ; rax : nombre a convertir ; iterateur : nb de chiffres ; adresse de la chaine a ecrire : [chaine_nb] contiendra le resultat ; rdx : chiffres a integrer dans la chaine push rbx xor iterateur, iterateur ; compteur de chiffres xor rdx, rdx ; chiffres a convertir mov rbx, 10 ; diviseur boucle_locale: div rbx add rdx, 48 ; devient un chiffre push rdx ; modulo inc iterateur cmp rax, 0 ; calcul termine ? jne boucle_locale mov rbp, chaine_nb add rbp, iterateur mov byte [rel rbp], 0 suite: pop rbx ; restitue chiffre ; ADRESSSE !!! mov rbp, chaine_nb add rbp, iterateur mov byte [rel rbp], bl dec iterateur cmp iterateur, 0 jge suite pop rbx ret
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
37
38
39
40
41
42 ; cl doit contenir le char est_un_chiffre: cmp cl, 48 jl non_chiffre cmp cl, 57 jg non_chiffre mov booleen, 0 ret non_chiffre: mov booleen, 1 ret est_un_nombre: push rbx push rcx ; rsi : adresse chaine a traiter mov booleen, 0 xor rcx, rcx xor rbx, rbx boucle_chiffres: mov byte cl, [rsi + rbx] cmp cl, 0 je fin_nmb inc rbx call est_un_chiffre cmp booleen, 0 je boucle_chiffres ; retournera booleen(0) si nombre fin_nmb: ; renvoie booleen = 1 si pas nombre pop rcx pop rbx ret
j obtient une erreur de type : invalid combination of opcode and operands
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 ; rsi doit contenir l adresse du texte a afficher ; rdx taille du texte a afficher calcul_taille: push rcx push rbx xor rcx, rcx xor rbx, rbx boucle2: mov byte cl, [rsi + rbx] cmp cl, 0 je fin2 inc rbx jmp boucle2 fin2: mov rdx, rbx pop rbx pop rcx ret
une idee ?
je pense avoir commis une faute syntaxique, mais je ne la trouve pas.
Merci.




Répondre avec citation




Partager