.data
nombre: .skip 16,0
taille: .long 0
valeur1: .long 0
valeur2: .long 0
.text
.globl main
.type main,@function
main:
#lecture du premier entier
movl $3, %eax # read () system call
movl $0,%ebx # %ebx = 0, fd = stdin
leal nombre,%ecx # %ecx ---> nombre
movl $16, %edx # %edx = count
int $0x80 # execute read () system call
movl %eax,taille # retour taille entree push %ecx #adresse de la chaine a lire
push taille #longueur de la chaine
leal valeur1,%eax #adresse du resultat
push %eax
call conversion #traduction chaine -> entier
#lecture du deuxieme entier
movl $3, %eax # read () system call
movl $0,%ebx # %ebx = 0, fd = stdin
[g]leal nombre,%ecx [/g]# %ecx ---> nombre
movl $16, %edx # %edx = count
int $0x80 # execute read () system call
movl %eax,taille # retour taille entree push %ecx #adresse de la chaine a lire
push taille #longueur de la chaine
leal valeur2,%eax #adresse du resultat
push %eax
call conversion #traduction chaine -> entier
#operation sur les entiers
movl valeur1,%eax
[g]addl %eax,valeur2[/g]
#traduction en chaine
leal taille,%eax
push %eax
leal nombre,%eax
push %eax
push valeur2
call traduction
## display string using write () system call
movl $4, %eax # write () system call
movl $1,%ebx # %ebx = 1, fd = stdout
leal nombre, %ecx # %ecx --->nombre
movl taille, %edx # %edx = count
int $0x80 # execute write () system call
## terminate program via _exit () system call movl $1, %eax # %eax = 1
[g]xorl %ebx, %ebx [/g]# %ebx = 0 normal program return code
int $0x80 # execute system call _exit ()
#fonction de conversion chaine en nombre
#les arguments dans la pile sont
# adresse de la valeur retour,(8)
# valeur de la taille (12)
# adresse de la chaine(16)
.globl conversion
.type conversion,@function
conversion:
push %ebp
movl %esp,%ebp
movl 16(%ebp),%ecx #ecx pointe sur la chaine a traduire
movl $0,%esi # indice chaine
movl $0,%eax # valeur initiale nulle
movl $0,%ebx # chiffre lu
[g]movb (%ecx,%esi),%bl [/g]# lecture du caractere
inc %esi # indice du c aractere suivant
movl $10,%edi # base de calcul
conv:
cmp 12(%ebp),%esi # compare indice au nombre de caracteres
je finconv # si egalite fin conversion
mul %edi # multiplication de eax par la base
sub $0x30,%ebx # passage de caractere a chiffre
add %ebx,%eax # ajout du chiffre a eax
movb (%ecx,%esi),%bl # caractere suivant
inc %esi # indice du suivant jmp conv # boucle
finconv: # fin de la boucle
[g]movl 8(%ebp),%ebx[/g]
movl %eax,(%ebx) # ecriture de la valeur
leave
ret $12
#fonction de traduction entier non nul vers chaine
#les argument sont
# la valeur (8)
# l'adresse de la chaine (12)
# l'adresse de la taille (16)
.globl traduction
.type traduction,@function
traduction:
push %ebp
movl %esp,%ebp
sub $16,%esp #reservation espace local inter
movl $0,%esi # indice chaine
movl %ebp,%ecx
subl $16,%ecx
# movl %esp,%ecx # ecx -> inter
movl 8(%ebp),%eax # valeur -> eax
movl $10,%edi # base dix
trad: cmp $0,%eax # tant que eax non nul
je fintrad # si eax nul
div %edi # division %edx%eax par %edi
movl %edx,%ebx # reste de la division (chiffre)
movl $0,%edx # remise a zero de edx
addl $0x30,%ebx # trasformation chiffre caractere
movb %bl,(%ecx,%esi) # carastere dans inter
inc %esi # indice du suivant jmp trad # boucle
fintrad:
# met dans l'ordre
dec %esi #nombre de chiffres
mov $0,%edi #indice chaine retour
movl 12(%ebp),%edx #edx pointe sur chaine retour
ordre:
cmp $0,%esi #tant que esi positif
jl finord #si esi negatif
[g]movb (%ecx,%esi),%bl[/g] #copie en sens inverse de inter
[g]movb %bl,(%edx,%edi)[/g] #dans chaine retour
dec %esi
inc %edi
jmp ordre finord:
[g]movb $0,(%edx,%edi)[/g] #place 0 en fin de chaine
movl 16(%ebp),%eax #adresse de la taille
movl %edi,(%eax) #valeur de la taille
leave
ret $12
|