- Besoin d'aide pour comprendre qques trucs Svp [ ASM INTEL LINUX ] - ASM - Programmation
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 !
Marsh Posté le 06-02-2004 à 21:14:26
Putain de syntaxe AT&T, c'est vraiment n'importe quoi et totalement absurde
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.
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 |
c'est clair !! ca vaut rien, il y a des caracteres speciaux partout. Vive NASM !!!
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