[ ASM INTEL LINUX ] - Besoin d'aide pour comprendre qques trucs Svp

- Besoin d'aide pour comprendre qques trucs Svp [ ASM INTEL LINUX ] - ASM - Programmation

Marsh Posté le 25-01-2004 à 14:17:32    

Salut,
mon prof d'architecture nous a filé des exemples de programme en soutiens de son "cours" dont il n'explique pas grand chose... donc si quelqu'un pouvait m'eclairer de ses lanternes ca serait sympa :)
 
Voici un programme :
 


.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
 


 
J'ai mis en gras kkes trucs que je comprend pas, deja jvois pas la différence entre leal et movl ;
ensuite quand on met quelque chose entre parentheses ou pas je sais pas ce que ca change ;
 
ce genre de lignes aussi : movb (%ecx,%esi),%bl , je comprend pas ce qui se passe, et les commentaires m'aident pas vraiment..
 
Enfin bref, j'ai un partiel jeudi, et j'aimerai bien comprendre un peu tout ca spaske c pas tres evident, alors si qqun peut m'aider, ou a des urls qui pourraient etre utiles ca serait cool :)
 
edit - ca marche pas le gras dans le texte fixé... :
 
leal nombre,%ecx        
xorl %ebx, %ebx          
sub $0x30,%ebx  
 
ensuite les $ c bien pour dire qu'on veut l'adresse et pas la valeur ?    


Message édité par Drizzt le 25-01-2004 à 14:20:15
Reply

Marsh Posté le 25-01-2004 à 14:17:32   

Reply

Marsh Posté le 06-02-2004 à 20:43:37    

Non, $ ça veut dire valeur.
les parenthèses (%ecx), je crois que c'est comme les [] en syntaxe MASM : c'est à dire qu'on veut prendre la valeur qui se trouve à l'adresse contenue par %ecx ici. (un peu comme l'astérisque quand tu déférences un pointeur en C si tu en as fait)
 
movb (%ecx,%esi),%bl
C'est l'opérateur d'indexation qui est utilisé ici, pour faire des semblants de tableaux.
 
Sinon ça fait un bail que j'ai pas utilisé cette syntaxe, très space, de l'assembleur... :)
 
Apprendre l'assembleur c'est mieux avec la syntaxe MASM car là ya presque rien sur le web qui pourra t'aider
Le meilleur truc que j'avais trouvé à l'époque c'est ce petit CHM :
http://www.john.findlay1.btinterne [...] /x86Op.zip
 
Bonne lecture !

Reply

Marsh Posté le 06-02-2004 à 21:14:26    

Putain de syntaxe AT&T, c'est vraiment n'importe quoi et totalement absurde :pfff:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-06-2008 à 14:04:32    

Salut, je sais que ca ne te sera pas très utile, mais si d'autres ont les mêmes interrogations, voici des réponses qui pourraient aider.
- Commencons pas la différence lea, mov. A priori, lea ne sert pas à grand chose car il peut être fait à partir d'un mov. Et voilà pourquoi :
 
lorsque tu fais : leal nombre,%ecx, tu mets l'adresse de 'nombre' dans le registre ecx.
 
Un mov, quand à lui, copie qqch dans qqch d'autre.
par exemple :
movl $10,%eax : mets la valeur immédiate 10 dans ton registre 4octets eax
movb %al,valeur2 ! mets la valeur contenue dans le registre 1 octet al dans valeur2
mais ecrire :
movl $nombre,%ecx, copie l'adresse de nombre dans ecx. Ce qui revient exactement à lea !
 
- pour les parenthese, c'est ca : movl $10,(%eax) : tu places la valeur immédiate 10 à l'adresse contenue dans eax
 
- movb (%ecx,%esi),%bl  : tu mets dans bl, la valeur sur un octet (movB) contenue à l'adresse contenue en memoire à l'adresse enregistree en memoire dans ecx + esi
 
- xorl %ebx,%ebx : tu fais un ou exclusif bit à bit d'un registre avec lui meme, donc tu le remets à 0
 
- subl $0x30,%ebx : tu enleves 30 au registre ebx.

Reply

Marsh Posté le 13-07-2008 à 20:06:25    

Harkonnen a écrit :

Putain de syntaxe AT&T, c'est vraiment n'importe quoi et totalement absurde :pfff:


c'est clair !! ca vaut rien, il y a des caracteres speciaux partout. Vive NASM !!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed