Initiation à l'assembleur

Cette page est en cours de rédaction! Des informations peuvent être erronées.

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