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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
|
calcul_taille_chaine: ; calcule la longueur de la chaine jusque 0 !!
; rdx : compteur
xor rdx, rdx
mov r9, rsi
; [rsi+rdx] : char
xor r10, r10
verif:
mov byte r10b, [r9+rdx]
cmp r10b, 0
je fin
inc dl
jmp verif
fin:
ret ; rdx renvoie le nb de char si aucun char -> dx = 0 (simple code 0)
placer_fin_chaine: ; place 0 en fin de chaine a la place du 10 (retour a la ligne de saisie)
; rsi : adresse
; rdx : compteur
xor rdx, rdx
mov r9, rsi
; [rsi+rdx] : char ([r9+rdx]...)
xor r10, r10
boucle:
mov byte r10b, [r9+rdx]
cmp r10b, 10 ; presence de retour a la ligne ?
je final
inc dl
jmp boucle
final:
mov byte [r9+rdx], 0
ret ; rdx renvoie le nb de char
est_un_nombre:
; rsi : adresse chaine
; retour dans booleen : OUI : est un nombre
; NON : ne l est pas
push r9
push rcx
mov r9, rsi
mov booleen, OUI
anonyme1:
xor rcx, rcx ; fin de chaine ?
mov byte cl, [r9]
cmp byte cl, 0
je fin_recherche ; si fin chaine & aucun NON -> retourne OUI !!
call est_un_chiffre ; booleen = NON : pas un chiffre !
cmp byte booleen, NON ; -> pas un nombre !
je fin_recherche ; retourne NON !
inc r9 ; rebouclage...
jmp anonyme1
fin_recherche: ; retourne le booleen...
pop rcx
pop r9
ret
est_un_chiffre:
; r9 : adresse du char
; retour dans booleen : OUI : est un chiffre
; NON : ne l est pas
cmp byte[r9], 48
jl non
cmp byte[r9], 57
jg non
mov byte booleen, OUI
ret
non:
mov byte booleen, NON
ret
; chiffre vers nombre
char_vers_nombre:
sub cl, 48
ret
; nombre(chaine) -> int rsi(adresse chaine)
chaine_vers_nombre: ; resultat -> rbx !!!
; verifier est_un nombre...
call est_un_nombre
cmp booleen, NON
je terminaison
; chaine dans rsi -> r9
mov r9, rsi ; adresse chaine
xor rbx, rbx ; rbx : resultat
call calcul_taille_chaine
; rdx : taille de la chaine de pos0 -> pos(tailleChaine-1)...
; plus grand chiffre : 10 exp (taille-1)
mov rax, 1 ; multiplicateur de 10
mov r12, rdx ; r12 nb char
multiple:
dec r12
cmp r12, 0
je ano2
imul rax, 10
jmp multiple
ano2:
calcul:
; calcul du chiffre... cl : code ascii du chiffre...
xor rcx, rcx
mov byte cl, [r9]
call char_vers_nombre
; cl contient le nombre a multiplier par r11...
imul rcx, rax ; chiffre * 10n
add rbx, rcx ; -> rbx
cmp rax, 1
jle terminaison
mov r11, 10
div r11 ; rax = rax/10
inc r9
cmp byte [r9], 0 ; fin de chaine ?
je terminaison
jmp calcul
terminaison:
ret ; RbX : resultat
nombre_vers_chaine:
; rbx contient le nombre...
; r15 : adresse chaine retour
xor r9, r9 ; compteur pile
mov r10, 1 ; multiple de 10
mov rax, rbx ; nb -> rax pour div...
ano3:
xor rdx, rdx
mov r13, 10
idiv r13 ; rax / 10 -> rdx : modulo
; resultat -> rax
push rdx ; modulo -> pile
inc r9 ; compteur de pile = 1 au minimum...
imul r10, 10 ; multiple de 10
cmp rax, 0 ; fin du calcul ?
jne ano3
; depilage :
xor r11, r11
depile:
xor rdx, rdx
pop rdx
add dl, 48
; rdx : char
mov byte[r15+r11], dl
inc r11
dec r9
cmp r9, 0
jne depile
mov byte[r15+r11], 0
ret
saisir: ; saisie texte clavier + place 0 en fin de chaine
; rsi doit contenir l adresse de stockage
mov rax, 0
mov rdi, 0
mov rdx, MAX ; 10 char max
syscall
call placer_fin_chaine
; call est_un_nombre ; calcul de booleen...
ret
; afficher
; rsi : adresse rdx : longueur depuis calcul_taille_chaine...
afficher:
call calcul_taille_chaine
mov rax, 1
mov rdi, 1
syscall
ret
retour:
mov rax, 1
mov rdi, 1
mov rsi, retour_ligne
mov rdx, 1
syscall
ret
afficher_quotient:
mov rsi, ch_num
call afficher
mov rsi, aff_rapport
call afficher
mov rsi, ch_den
call afficher
call retour
ret
saisie_quotient:
mov rsi, aff_num
call afficher
mov rsi, ch_num
call saisir
mov rsi, aff_den
call afficher
mov rsi, ch_den
call saisir
ret |
Partager