Assembleur

 


Vous disposez sur le site de tous les outils nécessaires à la compréhension du langage ASM. C'est pourquoi j'ai décidé de ne pas perdre trop de temps à vous récrire un tuto complet sur ce dernier. Il va de soi que je reprendrai dans chaque tutorial les commandes et renvois qui vont nous intéresser spécifiquement pour chaque programme.Encore une fois, ce site est destiné aux débutants, or ce serait refaire l'erreur des autres avant moi de ne pas tout prendre des le début.Vous ne trouverez donc rien dans cette page mis à part quelques instructions de base, qui ne vous éclaireront pas beaucoup.
UN COMPLEMENT A CE TUTO EXISTE ICI.
 
Au Programme:
1. Qu'est-ce que l'assembleur?
2. Les Registres
3. Les Opérandes ASM
4. Les sauts conditionnels
 

1 - Qu'est-ce que l'assembleur?
 

L'assembleur est Le langage de programmation le plus proche du micro presseur, c'est à dire qu'il ne fait appel qu’à des instructions élémentaires. Toute fonction tel qu’afficher une chaîne de caractères n'existe pas, elle est programmée. Par conséquent il est très rapide à l'exécution.
A retenir: En assembleur on travaille en hexadécimal et non en décimal. On ne compte donc pas de 1 à 15 mais de la manière suivante:
1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.


Illustration:


 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 A B C D E F


 
2 - Les Registres: AX, EAX, BX, CX, DX, EDX...

 

Il n'est pas nécessaire de connaître tous les registres pour cracker, connaître les plus utiles suffit mais tous les types de registres sont ici listés. Les registres sont des emplacements mémoire situés à l'intérieur du micro processeur. On les répartit en 4 catégories:


1. Les registres de segment (cf. *.pdf de Bushido)
2. Les registres de travail
3. Les registres d'offset
4. Le registre FLAG


Les registres de travail:
Il en existe de différentes types: 8bits, 16 bits et 32 bits.
EAX est un registre de 32 bits, AX de 16 bits, AL et AH deux registres de 8 bits.
AX représente la partie "basse" de EAX, AH la "haute" de AX (H= High) et AL la basse de AX (L=low)
Ainsi quand EAX=1234abcd AX=abcd AL=cd et AH=ab. De manière générale, AX est utilisé lors des opérations arithmétiques, CX comme compteur et DX pour les données.

remarque: Les registres 32bits commencent toujours par un E
registre de 16bits = AX, BX, CX, DX
registre de 32bits = EAX, EBX ....
 
Les registres d'offset:
SI= utilisé avec les chaînes de caractères
DI= utilisé lors d'opérations sur les chaînes de caractères
IP= registre pointant l'instruction suivante à exécuter, il n'est donc pas modifiable directement
BP= utilisé pour accéder aux données de la piles
SP= associé à SS pour accéder aux derniers éléments de la piles
Le registre FLAG:
C'est un registre de 16bits, mais sa valeur n'a aucune signification, car il est manipulé bits à bits. Le registre FLAG est très utiles lors des instructions effectuant un test ou une comparaison (bref toute instruction nécessitant une condition utilise le registre FLAG). Pour simplifier voici un petit tableau récapitulatif:
 
Bit Signification Abréviation
0 Retenue CF
2 Parité PF
4 Retenue auxiliaire AF
6 Zéro ZF
7 Signe SF
8 Trap TF
9 Interruption IF
10 Direction DF
11 Overflow OF
Les bits 1, 5, 12, 13, 14 et 15 du registre ne sont pas utilisés.
 
 

3 - Les opérandes (instructions) en ASM:


Seules les instructions les plus courantes de l'ASM seront ici listées: CALL, CMP, JMP, MOV.


o reg = registre
o mem = adresse mémoire,
o val = valeur hexadécimale
 
CALL:
syntaxe:
call mem
action:


call force le microprocesseur à exécuter les instructions du sous programme à l'adresse "mem" avant de continuer


CMP:
syntaxe:
cmp reg,val
cmp mem,val
cmp mem,reg
cmp reg,mem
cmp reg,reg

 

cmp compare la valeur de droite avec la valeur de gauche (ie cmp A,B <=> B-A puis affectation des indicateurs)
cmp change les indicateurs (le registre flag)


JMP:
syntaxe:
jmp reg
jmp val

 

jmp effectue un Unconditional Jump (saut inconditionel). Ainsi la prochaine instruction effectuée est CS:reg ou CS:val


MOV:
Syntaxe:
mov reg,val
mov mem,val
mov reg,mem
mov mem,reg
mov reg,reg

 

mov transfère le contenu de l'opérande de droite dans l'opérande de gauche. Aucun identificateur n'est modifié (le registre flag).
 
 

4 - Les sauts conditionnels:

Les sauts conditionnels sont basés sur la valeur des indicateurs. On les trouves généralement après CMP. Il existe 3 types de sauts conditionnels: les tests d'indicateurs, les test concernant les nombres signés et non signés.
 
Les tests d'indicateurs
Instruction Condition Action
JZ ZF=1 jump if zero
JE ZF=1 jump if equal
JNZ ZF=0 jump if not zero
JNE ZF=0 jump if not equal
JC CF=1 jump if carry
JNC CF=0 jump if not carry
JS SF=1 jump if sign
JNS SF=0 jump if not sign
JO OF=1 jump if overflow
JNO OF=0 jump if not overflow


Les tests de nombres non signés
Instruction Condition Action
JNBE ou JA CF=0 et ZF=0 jump if above (A>B)
JNB ou JAE ou JNC CF=0 jump if above or equal (A>=B)
JBE ou JNA (CF=1 et ZF=1) ou (CF<>ZF) jump if not above (A<=B)
JB ou JNAE ou JC CF=1 jump if below (A<B)
JE ou JZ ZF=1 jump if zero (A=B)
JNE ou JNZ ZF=0 jump if not zero (A<>B)


Les tests de nombres signés
Instruction Condition Action
JG ou JNLE ZF=0 et OF=SF jump if greater (A>B)
JGE ou JNL SF=OF jump if greater or equal (A>=B)
JNG ou JLE (ZF=0 et SF=OF) ou (ZF=1 et SF=OF) ou (ZF=0 et SF<>OF) jump if less or equal (A<=B)
JNGE ou JL SF<>OF jump if less (A<B)
JE ou JZ ZF=1 jump if zero
JNE ou JNZ ZF=0 jump if not zero


Il existe bien d'autres opérandes (ADD, SUB, OR, XOR, AND, ROLL) que nous verrons au fil de la progression.
Pour en savoir plus des maintenant et pousser vos connaissances, rendez-vous ici sur le tuto assembleur complémentaire.