Bonsoir à tous, dans le but d'essayer de mieux comprendre le fonctionnement "profond" du pc j'ai voulu me pencher sur l'assembleur.
Aprés avoir lu pas mal de chose la dessus je me suis penché sur un premier programme basique un simple hello world qui a fonctionné ( pas tout de suite mais j'ai fini par réussir ) mais en voulant compliqué la chose ca ne veux plus
Je suis sous Ubuntu 10.04 j'utilise gedit nasm et gcc
voici mon code :
C'est surement loin d'être parfait mais c'est mon premier test en asm.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 BITS 32 ; <- je ne sais pas a quoi ca sert :/ SECTION .data ; <- début des donnée "initialisée" toto db "toto",13,10,0 ; <- une simple chaine de caractéres taille equ $-toto ; <- affecte à taille la longeur de toto bien que je ne comprends pas exactement comment SECTION .text ; <- début du code GLOBAL main main: mov eax,4 ; <- préparation du syscall 4 pour écrire à l'écran mov ebx,1 mov ecx,toto mov edx,taille int 0x80 mov eax,20 ; <- syscall 20 : getpid mov ebx,0 int 0x80 mov ecx,eax ; <- stockage de la valeur de retour du getpid dans ecx en vue d'un affichage mov eax,4 mov ebx,1 mov edx,5 ; <- valeur mise un peu au hasard en me basant sur la taille des pid dans /proc int 0x80 mov eax,1 ; <- préparation de l'extinction du programme mov ebx,0 int 0x80
Comme vous avez pu le lire il y a encore beaucoup de chose que je ne comprends pas et que j'aimerai que vous m'expliquiez :
A quoi corresponds BITS 32 ?
comment l'expression est elle évalué ? que représente le '$' ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part taille equ $-toto
Il y a t il moyen de connaitre la valeur de 'taille' j'ai essayé de mettre taille dans ECX avec un EBX de 1, 2, 3, 4 mais jamais obtenu de résultat .
De même la tentative d'obtention du PID est sans résultat :/ ; il y a t il moyen de savoir la taille des données contenue dans ECX a savoir le PID afin de le stocker dans EDX
Et enfin, j'ai lu que l'on mettait les arguments dans les différent registres avant l'appel d'une fonction mais comment faire quand on a 10 arguments je n'ai pas de fonction de ce genre mais c'est simplement par curiosité .
Voici un lien que j'ai trouvé avec quelques syscalls : http://asm.sourceforge.net/syscall.html le reste étant disponible ( sous ubuntu 32b ) dans /usr/include/asm/unistd32.h et les pages man .
Merci d'avance, bonne soirée
Partager