C'est votre premiere visite sur ce site ? Vous ne savez pas ce qu'est ubuntu ? cliquer ici !

L'assembleur est un langage simple !

08/05/2008 a 23h26 | 1517 hits

Petite réflexion simple sur l'assembleur : j'aimerais changer les idées des programmeurs de nos jours, qui, beaucoup estiment que l'assembleur est un langage de programmation compliqué et pour les pro-geek sans même en avoir vu une ligne !

L'assembleur est l'un des tous premiers langage de programmation qui exista ! Bien que celui-ci soit assez vieux, et plus tellement enseigner, il est pourtant aujourd'hui encore utilisé ! Ce langage est la base de tout autre langage ! Et apprendre à maitriser ce langage permet de mieux connaitre son langage de programmation préféré (bon, en même temps, si vous programmez en "php", passez votre chemin smile ) . Du fait de son ancienneté, beaucoup de personnes voient en ce langage un montre ! Pourtant, il ne se cache rien d'autre derrière lui que des instructions de programmation simple .
Il y a cependant deux points de vu à analyser par le mot "simple" : simple à apprendre et à comprendre, ou bien simple à utiliser . Nous verrons donc pourquoi je dis de ce langage qu'il est simple à apprendre, et pourquoi il est, en revanche, moins simple à utiliser !


L'assembleur, qu'est-ce que c'est en faite ? qu'est-ce qui le différencie des autres langages ? Et bien tout simplement son bas niveau ! Oubliez tous les "if", "for", "while", "else", etc, ces noms, ou bien soit disant ces instructions de programmations n'existent pas : ni du niveau de votre matériel, ni au niveau de ce langage !
Un code assembleur n'est qu'un suite d'instruction qui vont être directement traduit en langage machine ! (peu d'étape à faire pour le compilateur, il suffit de traduire votre langage en anglais en langage binaire)

Prenons un exemple de code simple : afficher un "hello world" :


.section .text
_start:

movl $4, %eax
movl $1, %ebx
movl $Str, %ecx
movl $14, %edx
int $0x80

movl $1, %eax
movl $0, %ebx
int $0x80

Str: .string "Hello, World !"

Voyez vous ? Ce ne sont que des instructions . Ici, nous avons 2 sortes d'instruction : "move" (movl) et "int" . L'instruction move sert à placer une valeur à un variable, plus précisément un registre du processeur. Ainsi, eax, ebx, edx sont des registres représentant 4 octets chacun (soit un entier en c avec un processeur 32 bits). le premier argument de move est une valeur, et le second le registre . La valeur est ici précédé d'un "$", mais cela est du à la syntaxe de GAS ...
L'instruction "int" sert à appeler une interruption du système, les interruptions sont des micro-programmes (vous pouvez tous les consultez dans un table de Ralph Brown) . Ici, l'intérruption 0x80 nous sert à appeler une syscall (de linux) qui est la syscall "write" . C'est la syscall n° 4, ainsi, nous avons enregistré ce nombre dans le registre eax . Dans ebx, nous mettons le descripteur de fichier : le descripteur de fichier dont la valeur est 1 est le descripteur de fichier "stdout", soit le flux sortant ! Il nous reste encore à donner l'adresse de la chaîne à afficher dans ecx, puis la longueur de la chaine dans edx et enfin, nous pouvons afficher notre chaine par le biais de l'interruption 0x80 smile .
Puis, nous passons la valeur 1 à eax : la syscall n° 1 est la syscall "exit" . Nous mettons la valeur de retour du programme dans ebx, et nous pouvons quitter le programme par le biais de l'instruction 0x80 .

Bien, comme vous avez pu le remarquer, ce langage n'est pas non plus une suite de nombre incompréhensible, des caractères bizarre ou je ne sais quoi !
J'aimerais néanmoins revenir sur les boucles : les "while(...){...}" et les "for" n'existant pas, comment fait-t-on ? et bien, on définie une sorte de label dans notre code, et une instruction spéciale revient à ce label tant que un certaine comparaison est fausse . Je ne veux pas vous embrouiller l'esprit, mais regardez ceci :

movl $0, %eax
movl $10, %ecx
loop_start:
movl %ecx, %eax
loop loop_start

Ici, loop prend en argument un endroit où il faut revenir sur une comparaison est fausse .
Tout d'abord, loop décrémente le registre ecx, puis il compare si ecx vaut 0 ou non, si ecx vaut 0, on continue le programme, sinon, on revient à loop_start . Ce bout de code équivaut à celui-ci en C :

int sum,i;
for(sum=0, i=10; i>0; sum+=i, i--);


Ce langage est donc relativement simple à comprendre, mais extrêmement difficile à utiliser : au bout d'un moment, on se perd dans ces suites d'instruction qui se ressemble : en effet, on a toujours "instruction argument1 argument2", c'est pour cette raison que l'on peut dire que ce langage est difficile ! De plus, mettre des commentaires est une vrai nécessité pour comprendre le programme d'un autre : il est difficile de lire un code asm et de tout comprendre en un clein d'oeil .

Ainsi, l'assembleur n'est pas en soit un langage difficile, mais ses instructions sont tellement bas niveau qu'il devient difficile de faire un code compréhensible et lisible .

retour lire/ajouter des commentaires [0]

[ Copyright 2007 © antoinexp, tous droits réservés ] designed by antoinexp, linuxearth@free.fr |