=======> Ecrire_nb
Ecrire_nb macro nb?,groupement_chiffres?
local boucle,boucle2,fin,non,non2,non_param1,non_param2,non_param3,non_param4,param2
code segment use16
pushf
pusha
; si le 2eme param est != 0 , on va se servir de di donc
cmp param2,1
jne non_param1
; on le met a 0
xor di, di
non_param1:
; transferer le param ds ax
mov ax, nb?
; mettre un repere ds la pile
push 10
; 1ere boucle pr diviser le nb en chiffre a afficher
boucle:
; mettre dx a 0 pr diviser juste ax
xor dx, dx
; diviser par 10
mov bx, 10
div bx
; mettre le reste ds la pile
push dx
; si le param est != 0 , on incremente di
cmp param2,1
jne non_param2
inc di
non_param2:
; rien besoin de changer pr la prochaine division car
; le quotient est placer ds ax
; comparer le quotient a 0
cmp ax, 0
; si il n'est pas egal on continue
jne boucle
cmp param2,1
jne non_param3
; diviser par 3 le nb total de chiffres empilés,
; pr savoir au bout de combien de chiffres il faut mettre le 1ère espace
mov ax, di
xor dx, dx
mov bx, 3
div bx
mov di, dx
; mais si le nb total de chiffres empilés est 1 multiple de 3,
; le reste sera = 0 , donc il faut le mettre a 3 car sinon ,
; il mettra 1 espace avant de commencer a afficher le nb
cmp di, 0
jne non2
mov di, 3
non2:
non_param3:
; 2eme boucle pr afficher les chiffre contenue ds la pile
boucle2:
; si le param est != 0
cmp param2,1
jne non_param4
; on met ds bp le pointeur sur le sommet de la pile
mov bp, sp
; on compare di avec 0 pr savoir si il faut afficher un espace
cmp di, 0
jne non
; on vérifie si le prochain chiffre dépilé est 10 , si c'est le cas c'est notre indice,
; cela signifie que l'on est a la fin du nb
cmp [bp], 10
; et qu'il ne faut donc pas écrire d'espace
je non
; mettre a 3 notre indice
mov di, 3
; afficher un espace
Ecrire_chaine <' '>
non:
; sinon on décrémenter notre indice
dec di
non_param4:
; on restaure le dernier chiffre empiler ds bx
pop bx
; puis on le compare a 10 notre indice
cmp bx, 10
; pr savoir si on a fini
je fin
; puis on ajoute 48 au chiffre pr obtenir le code ascii
add bx, 48
; puis on met la partie basse de bx ds dl
mov dl, bl
; et enfin on appel l'interruption pr afficher un caractere
mov ah, 02h
int 21h
; si on arrive ici c'est qu'on a pas fini dc un saut inconditionnel
jmp boucle2
fin:
popa
popf
code ends
data segment use16
; pr le cas ou l'utilisateur ne rentrerai aucun 2eme param
param2 db groupement_chiffres?
data ends
endm
=======> Ecrire_chaine
Ecrire_chaine macro text?
local texte
pushf
pusha
data segment use16
texte db text?,'$'
data ends
code segment use16
; num de la fonction
mov ah, 09h
; on met ds dx l'offset de la chaine
mov dx, offset texte
; appel de l'interruption
int 21h
code ends
popa
popf
endm
et pr le dernier macro cest pareil que sauf qu'il faut passé en param l'offset d'1 chaine
en fait tt ces macros font partie d'1 librairie que je créer depuis que j'ai commencer l'asm et je me demandais si je pouvais pas les arrangé ?