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 :

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
C'est surement loin d'être parfait mais c'est mon premier test en asm.

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 '$' ?

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