Accueil

Web

FaceBook

Telechargement

Contact

 

Ajouter aux Favoris

    Bienvenue ! 28/03/2024 @ 21:12:28 - IP : 52.91.67.23 -



Les cours du langage Assembleur - ZNsoft Tutorial
 




 

Microsoft

Télécharger

SQL Server 2012

Pinpoint

Visual Studio

Choisir son PC

 
 

Developpement

Visual Basic

Langage C

Java

Assembleur

Delphi

SQL

Python

WinDev

 
 

Systèmes OS

Ms Dos

Windows 9.x

Windows Nt

Windows Vista

Unix

Linux

Mac Os

 
 

Conception Web

PHP

ASP

Html

XmL

Flash Adobe

Director Adobe

WebDev

Java Script

 




Livre GRATUIT:
Livre gratuit pour maitriser Google Docs



 
 

 

Sommaire :


Présentation - Les bases d'Asm - Programmation du microprocesseur - Application Asm

Programmation du Microprocesseur

 

Cours du langage Assembleur pour les débutants

 

 

Programmation du Microprocesseur

 

Développer et déployer facilement vos sites web

Télécharger gratuitement Office 2013

Héberger votre site web sur des serveurs gratuits

Visual Studio 2013

Télécharger et apprenez gratuitement

Trucs et Astuces

Découvrez Windows 8.1 et télécharger le gratuitement

 

• Que sont les registres ?

Ce sont des petites zones de mémoire contenues dans le microprocesseur. Pour accéder à ces registres, le bus n'est pas sollicité, donc l'accès y est très rapide, par rapport à la mémoire RAM. Ces registres sont en nombre limité, d'ailleurs ils sont très peu nombreux par rapport à d'autres microprocesseurs (comme le 68000 de Motorola). On peut les classer en différentes familles :

• Les registres généraux

Ils sont au nombre de quatre : EAX, EBX, ECX et EDX. Ce sont des registres de 32 bits. La particularité de ces registres est qu'ils sont décomposables en plusieurs parties : pour vous l'expliquer je vais prendre comme exemple le registre EAX.

On peut donc lire ou écrire une valeur de 32 bits dans EAX, de 16 bits dans AX, et de 8 bits dans AH et AL. Notez que le H de AH signifie High et le L de AL Low. Quant au E de EAX, il signifie Extended : en effet avant le 386 seule la partie 16 bits existait ; avec le 386, on a "rallongé" sa taille. Attention : si vous modifiez AH, vous modifiez EAX également : en effet ces registres sont "imbriqués".
Remarque : On ne peut pas accéder à la partie haute de EAX directement. Pour modifier/lire uniquement les 16 derniers bits, on procédera donc au masquage de bits (voir la section les opérateurs logiques).

EBX, ECX et EDX sont décomposables exactement de la même manière.

Utilisation générale de ces registres :
EAX est appelé "accumulateur", car on s'en sert souvent comme registre "à tout faire", ou pour ranger des données temporaires. EBX est appelé "base", car quelquefois il contient l'adresse de base d'une zone mémoire, mais on peut bien entendu l'utiliser comme bon nous semble. ECX est le "compteur". Bien qu'on puisse en faire ce qu'on veut, il est très souvent utilisé comme compteur, notamment par l'instruction "loop" (voir les sections suivantes). Et enfin EDX est appelé "registre de données". En entrée de nombreuses fonctions (BIOS, DOS, librairies), on s'en sert comme paramètre.

Remarque : Ne croyez pas qu'il sont limités à cette utilisation ! Vous pouvez en faire absolument ce que vous voulez, c'est juste une question d'organisation.

• Les registres de segment

La signification des registres de segment dépend du mode du processeur : mode réel ou mode protégé. Dans les deux cas, les registres de segment pointent vers une zone de mémoire.

Tous les pointeurs sont constitués d'une adresse de segment et d'une adresse d'offset. Ces deux adresses combinées, on obtient l'adresse linéaire, ou physique. En gros, un segment est une portion de mémoire, et un offset est une position dans ce segment. La raison de ce découpage dépend du mode. En mode réel, c'est pour pallier à la faible capacité des registres (le mode réel est compatible avec les premiers processeurs, qui possédaient seulement des registres de 16 bits). En mode protégé, c'est pour des raisons de sécurité et de partage des ressources (multitâches). Il est fort possible si vous débutez en programmation que vous n'ayez rien compris à ce que je viens de dire : pour plus de détails, voyez la section mode réel et mode protégé. Sachez simplement que les adresses sont formées par un segment et un offset.

On note la combinaison segment et offset "segment:offset"

Avant l'exécution de votre programme, le système d'exploitation alloue de la mémoire pour stocker l'ensemble du code (instruction assemblées) et des données (variables). Le stockage en mémoire du programme est obligatoire, car comme vu précédemment, le processeur prend connaissance des instructions en allant les chercher dans la RAM : il en est ainsi pour des raisons évidentes de vitesse d'exécution (le disque dur est extrêmement lent, comparé à la mémoire RAM). Comme vous ne pouvez connaître à l'avance cette adresse (elle ne peut pas être choisie par vous car elle est peut-être déjà prise par un autre programme ; c'est le système d'exploitation qui gère la mémoire et qui définit l'adresse de votre programme en mémoire, qui sera donc différente à chaque exécution), le système d'exploitation vous la transfère avant de vous donner la main (c'est-à-dire d'exécuter votre programme). Vous devez alors la stocker dans un registre de segment, ainsi tous vos accès mémoire concernants les variables internes au programme seront valides : les offsets sont les mêmes à chaque fois, seules les adresses de segment changent. Si vous n'avez pas compris ces explications théoriques, ne vous inquiétez pas, tout devrait aller mieux par la pratique.

Il existe en fait plusieurs registres de segment. D'abord, le registre CS (Code Segment) qui contiendra l'adresse de segment de votre code. Associé à un offset, il permettra aux instructions de branchement de faire des sauts à l'intérieur du programme. De la même manière, DS (Data Segment) contiendra l'adresse de segment de vos données, c'est-à-dire les variables. Pour accéder à une variable, il faudra donc associer un offset avec DS.

Nous verrons dans la section la pile le rôle du registre SS (Stack Segment).

Vous disposez également de registres de segment supplémentaires qui pourront vous servir lors de l'utilisation de certaines instructions ou appels systèmes (BIOS, DOS). Ils se nomment ES (Extra Segment), FS et GS.

Vous remarquerez que je n'ai jamais parlé de leur taille, en effet elle dépend du mode du processeur et nous verrons cela plus tard.

• Les registres pointeurs

Ces registres ont un rôle particulier et ne peuvent donc pas être manipulés comme les registres généraux, sauf ESI et EDI.

ESI (Source Index) et EDI (Destination Index) sont utilisés dans les instructions de chaîne. Ce sont des registres de 32 bits. Nous verrons leur rôle plus en détail lors de la présentation des instructions du processeur 80386. Sachez que vous pouvez utiliser ces registres comme vous le souhaitez, et que vous pouvez accéder aux 16 premiers bits par les sous-registres SI et DI.

Les registres EBP (Base Pointer) et ESP (Stack Pointer) seront traités dans la section la pile.

Enfin, il y a le registre EIP (Instruction Pointer), qui a un rôle très important : il pointe constamment sur la prochaine instruction à exécuter, relativement à CS. Le processeur va charger les instructions à l'adresse CS:IP (ou CS:EIP en mode protégé) avant de les exécuter. Il incrémente (E)IP à chaque exécution d'une instruction. Vous ne devez pas le modifier si vous ne savez pas ce que vous faisez, sous peine de plantage assuré !

• Le registre de flag

Ce registre très spécial sera traité en détail dans les section suivantes.

 

Présentation de quelques instructions

• Formation des instructions

Une instruction est formée par :

- La mnémonique de l'instruction, c'est-à-dire son nom. L'assembleur traduira cette mnémonique par l'OpCode correspondant, c'est-à-dire le code de l'instruction, que le microprocesseur saura déchiffrer.
- Eventuellement d'une ou plusieurs opérandes, selon les instructions. En général, les instructions exigent deux opérandes, mais il existe des instructions qui en demandent trois, une seule, voire même aucune. Les opérandes peuvent être un registre, une adresse mémoire, ou une valeur immédiate.

• MOV

De l'anglais "move". Cette instruction sert à copier une valeur (et pas à la déplacer, contrairement à ce qu'on pourrait penser). Elle demande deux opérandes (arguments) : l'opérande destination, et l'opérande source, dans cet ordre. C'est-à-dire que :

mov ax,10

met dans le registre AX la valeur 10 (quand on ne précise pas le système de numérotation, le système décimal est utilisé).

L'opérande destination peut être un registre ou une adresse mémoire (voir la section variables et formation des adresses). Dans ce dernier cas, la valeur de l'opérande source serait copiée dans l'endroit de la RAM pointé par l'adresse donnée. Evidemment, l'opérande destination ne peut pas être une valeur immédiate (c'est-à-dire un nombre) !
L'opérande source peut être un registre, une adresse mémoire, ou une valeur immédiate.

Remarques :

- Compte tenu du codage des instructions, les opérandes ne peuvent pas être toutes les deux des adresses mémoire. D'ailleurs, ceci est vrai pour TOUTES les instructions. Par exemple, si vous voulez copier la valeur de la variable var1 dans la variable var2, vous ne pouvez pas faire un simple mov [var2],[var1] (voir la section variables et formation des adresses pour l'utilisation des variables). A la place, vous devez utiliser un registre (par exemple AX) :

mov ax,[var1]
mov [var2],ax

- Les opérandes doivent avoir la même taille. Vous ne pourrez donc pas faire :

mov eax,bx

Car EAX fait 32 bits alors que BX n'en fait que 16.
Si
au moins une opérande est un registre, alors la taille de l'autre opérande est sous-entendue. Par exemple, dans :

mov [var1],ax

AX est copié dans le mot d'adresse var1. Mais si la taille d'aucune des opérandes ne peut être déduite, alors vous devez la préciser par byte (8 bits), word (16 bits), ou dword (double word, 32 bits) :

mov [var1],word 10

ou

mov word [var1],10

Comme la taille des opérandes est toujours la même, vous pouvez vous contentez d'indiquer la taille d'une seule opérande.

• Instructions mathématiques

Ce sont des instructions très basiques : ADD pour additionner, SUB pour soustraire, MUL pour multiplier et DIV pour diviser. ADD et SUB sont très rapides à l'exécution, tout comme MOV, alors que MUL et DIV sont affreusement lentes (tout est relatif, bien sûr) !

ADD et SUB demandent deux opérandes : une destination puis une source. La destination et la source sont additionnés/soustraits, et le résultat est placé dans la destination. Les règles pour les opérandes sont toujours les mêmes : elles ne peuvent pas être une référence mémoire toutes les deux en même temps ; et bien sûr la destination ne peut pas être une valeur immédiate.

Exemple :

mov ax,500  ; ax <-- 500
mov bx,0x20 ; bx <-- 0x20=32
add ax,bx   ; ax <-- ax+bx

Notez que les ";" marquent le début d'un commentaire. Tout le reste de la ligne est alors ignoré. Cet exemple aurait aussi pu être écrit ainsi :

mov ax,500  ; ax <-- 500
add ax,0x20 ; ax <-- ax+0x20

Remarque : Comme vu dans la section les systèmes de numérotation, les nombres peuvent êtres signés ou non signés. Dans les deux cas, le résultat sera bon. Vous pouvez même additionner un nombre signé et un nombre non-signé : en effet un nombre non-signé et un nombre signé positif sont codés de la même façon.

Pour la multipication et la division, c'est un peu plus compliqué. En effet cette fois ci il faut prendre en compte le signe des opérandes, car comme vous le savez deux nombres de même signe donneront un résultat positif, et deux nombres de signes différents donneront un résultat négatif. Comme le processeur ne peut pas deviner si les opérandes que vous lui donnez sont signées ou non signées, on a en fait deux instructions différentes pour la multiplication : MUL pour les opérandes non-signées et IMUL pour les opérandes signées. De même, on a DIV et IDIV.

L'utilisation de MUL n'est pas semblable à celle de ADD et de SUB. En effet MUL ne recquiert qu'une seule opérande : une opérande source, qui peut être une référence mémoire ou un registre, de 8, 16 ou 32 bits.
Si l'opérande est de 8 bits, alors la source est multipliée par AL et le résultat est placé dans AX. Si elle est de 16 bits, la source est multipliée par AX et le résultat est placé dans la paire de registre DX:AX. Ici DX ne représente pas un segment : DX:AX se comporte comme un registre de 32 bits, AX représentant les 16 bits de poids faible et DX les 16 bits de poids fort. Cette manière spéciale de renvoyer un résultat a été adoptée car avant les 386, les registres de 32 bits n'existaient pas. Cela a été gardé pour des raisons de compatibilité. Enfin, si la source est une référence mémoire ou un registre de 32 bits, la source est multipliée par EAX et le résultat est stocké dans EDX:EAX.

Exemple :

mov ax,788 ; ax <-- 788
mov bx,654 ; bx <-- 654
mul bx     ; dx:ax <-- ax*bx

Le but de cette initiation n'est pas de présenter la liste exhaustive de toutes les instructions et de montrer leur utilisation spécifique. Pour cela, voyez la documentation de NASM qui présente toutes les instructions supportées, même les nouvelle instructions du Pentium et du Pentium MMX (le processeur minimal est indiqué pour chaque instruction). Il y est détaillé le type des opérandes de chaque insctruction, la manière dont on peut les combiner, ainsi qu'une description de l'instuction. Voyez donc comment fonctionne IMUL, DIV et IDIV

  Sections et labels :

• Les différentes sections d'un programme

Les octets constituants un programme sont séparés en au moins 2 sections : une section de code et une section de données. Suivant le format de fichier objet choisi pour l'assemblage (option -f de Nasm), les noms des sections vous sont imposés ou non. Evidemment, si vous envisagez de linker plusieurs fichiers objets, ils doivent avoir le même format et posséder les mêmes noms de sections.

• La section de code

Elle porte en général le nom .text. Elle contient les instructions exécutables.



Déposez votre CV
lien de téléchargement direct
50 tirages offerts à l'inscription chez myPIX.com!
Dépot de CV gratuit sur Touslesemplois
Logiciel de référencement automatique

 

         

Devenez membre ZNsoft : La communauté Informatique

Cours -  Etudiants -  Concours -  Congrès -  Téléchargement -  Formations


_________________________________________________________________________________________________________
Qui sommes-nous ? | Contact | | Inviter un ami | Soutenir ZNsoft | Revue de press | Références
ZNsoft Corporation, Tous Droits Réservés © 2002/ 2024 ZNsoft RSS
  Dernière mise à jour : 25/03/2024