meta données pour cette page
Initiation à l'assembleur
Nous parlerons ici du langage assembleur dans un cas général car les instructions d'un assembleur à un autre peut varier. Notons que l'on parlera ici de la version NASM () qui est une version développé par Microsoft.
Notons que le format utilisé pour comprendre la lecture des registre :
opération <destination>, <source>
Terminologies
- Stack
The Stack est une partie de la mémoire où vous pouvez stocker différentes choses pour une utilisation ultérieure. Nous pouvons le voir comme une panière à papier où vous mettez des feuilles. Le panier est la pile et une feuille est une adresse mémoire dans ce segment de pile. Rappelez-vous la règle suivante: la dernière feuille de papier que vous avez placée dans la pile est la première que vous supprimez! La commande 'push' enregistre le contenu d'un registre sur la pile. La commande 'pop' saisit le dernier contenu enregistré d'un registre de la pile et le met dans un registre spécifique.
- Word
Un mot prend juste 2 octets (soit 16 bits) et peut être sous forme hexadécimal.
- DWORD
Est une suite de mot qui forme un groupe de 4 octets soit 32 bits et peut être sous forme hexadécimal.
- Segment
C'est comme prendre une feuille dans la panière à papier.
- Offset
C'est comme une ligne présente sur la feuille
Exemple de code
org 0x0100 ; ceci est un programme affichant ; simplement "Hello World" mov dx, texte mov ah, 0x09 int 0x21 ; afficher le hello world ret ; fin du programme texte: db 'Hello, World !!', 10, 13, '$'
Une fois l'écriture terminée, on devra lancer cette commande pour assembler le code :
$nasm code.src -o programme.asm
Ce prorgamme pourra être éxécuté sur windows ainsi :
C:>programme.asm
Sous linux :
$ dosbox programme.asm
Les Registres
De taille 32 bits
opcodes | Description | |
---|---|---|
EAX | Extended Accumulator Register | variable temporaire de type Accumulateur |
EBX | Extended Base Register | variable temporaire de type Base |
ECX | Extended Counter Register | variable temporaire de type Compteur |
EDX | Extended Data Register | variable temporaire de type Données |
ESI | Extended Source Index | Pointeur d'index de source |
EDI | Extended Destination Index | Pointeur d'index de destination |
EBP | Extended Base Pointer | concerne les piles et les files de données / Pointeur de Base |
ESP | Extended Stack Pointer | Stocke les données quelque part / Pointeur de pile |
EIP | Extended Instruction Pointer | pointe toujours sur l'instruction suivante / Pointeur d'instruction |
De taille 16 bits
opcodes | Description | |
---|---|---|
AX | Word-sized | |
BX | Base | utilisé conjointement avec la pile |
CX | Counter | |
DX | Data | Où les opérations mathématique sont stocké |
DI | Description Index | une chaine serait copié pour DI |
SI | Description Index | une chaine serait copié depuis DI |
BP | Base Pointer | Spécifie la position d'une stack |
SP | Stack Pointer | Spécifie la position d'une stack |
CS | Code Segment | Instruction d'une application à executer |
DS | Data Segment | Données que l'application à besoin |
ES | Extra Segment | |
SS | Stack Segment | Lieu où se trouve un tas de données |
IP | Instruction Pointer | Pointe directement vers l'instruction suivante |
De taille 8 bits
opcodes | Description |
---|---|
AH ou AL | Hight Part / Low Part |
BH ou BL | |
CH ou CL | |
DH ou DL |
Les drapeaux / Flags
Ils sont utilisé pour indiquer le status de quelque chose. Notamment lors d'une condition, un flag peut servire à indiquer si l'instruction sera à l'état 1 (vraie) ou 0 (faux). En intervenant dessus, le comportement du programme peut radicalement changer!
- Z-Flag
Utilisé à 90% du temps car nous utilisons très souvent des conditions en programmation tel que “if” ou “else”. Elles sont souvent recérable lors de l'appel de l'instruction “CMP”.
- O-Flag
Utilisé à 4% du temps…
- C-Flag
Utilisé à 1% du temps…
Les instructions / ppérations
opcodes | code hexa | Syntaxe | Description | |
---|---|---|---|---|
ADD | ADD destination, source | Additionner des valeurs | ||
AND | AND destination, source | Un ET logique | ||
CALL | CALL <quelque chose> | Appel quelque chose à l'emplacement que l'on veut | ||
CDQ | CQD | Convertie un DWord (mot) de 4 octets en 8 octets | ||
CMP | CMP destination, source | Compare deux valeurs | ||
DEC | DEC <quelque chose> | Décrémente une valeur | ||
DIV | DIV <diviseur> | Utile pour diviser un nombre | ||
INC | INC <registre> | Incrémente la valeur d'un registre | ||
MOV | MOV destination, source | Déplacement une valeur dans un autre emplacement | ||
LEA | LEA destination, source | Identique à MOV sauf qu'elle peut faire un calcul en même temps | ||
MUL | MUL <valeur> | Multiplie une valeur | ||
NOP | 0x90 ou 6690 | NOP | C'est le néant, ne fait rien | |
OR | OR destinatin, source | Fonction logique du OU inclusif | ||
POP | POP destination | Supprime la dernière valeur de la file du stack | ||
PUSH | PUSH <operation> | Pousse une nouvelle donnée dans la file du stack | ||
RET | RET | Détient le retour d'une instruction tel que CALL | ||
SUB | SUB destinatin, source | Utilise pour effectuer des soustraction | ||
TEST | TEST operation1, operation2 | Très souvent utilisé pour comparer deux valeurs (EAX,EAX). Et influe du le flag Z-Flag | ||
XOR | XOR destination, source | Fonction logique du OU exclusif |
Les Jumps
Il y en a beaucoup! Très souvent nous intervenons sur JNZ, JZ, JE ou JNE.
opcodes | code hexa | Syntaxe | Description |
---|---|---|---|
JA | Jump if (unsigned) above | CF=0 and ZF=0 | |
JAE | Jump if (unsigned) above or equal | CF=0 | |
JB | Jump if (unsigned) below | CF=1 | |
JBE | Jump if (unsigned) below or equal | CF=1 or ZF=1 | |
JC | Jump if carry flag set | CF=1 | |
JCXZ | Jump if CX is 0 | CX=0 | |
JE | 0x74 | Jump if equal | ZF=1 |
JECXZ | Jump if ECX is 0 | ECX=0 | |
JG | Jump if (signed) greater | ZF=0 and SF=OF (SF = Sign Flag) | |
JGE | Jump if (signed) greater or equal | SF=OF | |
JL | Jump if (signed) less | SF != OF (!= is not) | |
JLE | Jump if (signed) less or equal | ZF=1 and OF != OF | |
JMP | Jump | Jumps always | |
JNA | Jump if (unsigned) not above | CF=1 or ZF=1 | |
JNAE | Jump if (unsigned) not above or equal | CF=1 | |
JNB | Jump if (unsigned) not below | CF=0 | |
JNBE | Jump if (unsigned) not below or equal | CF=0 and ZF=0 | |
JNC | Jump if carry flag not set | CF=0 | |
JNE | 0x75 | Jump if not equal | ZF=0 |
JNG | Jump if (signed) not greater | ZF=1 or SF!=OF | |
JNGE | Jump if (signed) not greater or equal | SF!=OF | |
JNL | Jump if (signed) not less | SF=OF | |
JNLE | Jump if (signed) not less or equal | ZF=0 and SF=OF | |
JNO | Jump if overflow flag not set | OF=0 | |
JNP | Jump if parity flag not set | PF=0 | |
JNS | Jump if sign flag not set | SF=0 | |
JNZ | Jump if not zero | ZF=0 | |
JO | Jump if overflow flag is set | OF=1 | |
JP | Jump if parity flag set | PF=1 | |
JPE | Jump if parity is equal | PF=1 | |
JPO | Jump if parity is odd | PF=0 | |
JS | Jump if sign flag is set | SF=1 | |
JZ | Jump if zero | ZF=1 |