Cours assembleur Intel initiation à la programmation en assembleur

Chapitre 1
1 RAPPEL : LES SYSTÈMES DE NUMÉRATION
1.1 Le binaire
1.2 L’hexadécimal
1.3 Opérations Arithmétiques
1.3.1 L’addition
1.3.2 Les dépassements dans l’addition
1.3.3 Les dépassements dans la multiplication
1.4 Les nombres négatifs
1.5 Les opérations arithmétiques avec les nombres négatifs
1.5.1 L’addition
1.6 Les opérations logiques
1.6.1 Le « ET » logique
1.6.2 Le « OU » logique (aussi appelé ou inclusif)
1.6.3 Le « OU EXCLUSIF »
1.6.4 Le « NON » aussi appelé complémentation
1.7 Les décalages binaires
1.7.1 Le décalage binaire gauche
1.7.2 Le décalage binaire droit
1.7.3 A quoi ça sert ?
1.7.4 La rotation binaire gauche
1.7.5 La rotation binaire droite
Chapitre 2
2 INTRODUCTION : LES MICROPROCESSEURS INTEL
2.1 La mémoire
2.2 Des segments pour se positionner dans la mémoire
2.3 Un microprocesseur pour agir sur la mémoire
2.3.1 LES BUS DE COMMUNICATION
2.3.1.1 Le bus d’adresse
2.3.1.2 Le bus de données
2.3.1.3 Le bus de contrôle
2.3.1.4 Mécanisme d’accès mémoire
2.3.1.5 Temps d’accès mémoire
2.3.2 LA MEMOIRE CACHE
2.3.2.1 La mémoire cache interne
2.3.2.2 La mémoire cache externe
2.4 Les registres
2.4.1 Les registres généraux
2.4.1.1 Le registre EAX
2.4.1.2 Les registres EBX, ECX, EDX
2.4.2 Les registres de segments
2.4.3 Rôle des registres de segments
2.4.4 Les registres d’index
2.4.5 Les différents registres d’index (sur 32 bits)
2.4.6 Les registres de travail du microprocesseur
2.4.6.1 EIP
2.4.6.2 Registre de flag (32 bits à partir du 386)
2.4.7 La pile
2.5 Assembleur et langage machine
Chapitre 3
3 LA MÉMOIRE EN DÉTAIL
3.1 Segmentation de la mémoire
3.2 Les emplacements réservés
3.3 La pile
3.4 Les modes d’adressage
3.4.1 Accès aux instructions
3.4.2 Accès aux données
3.4.3 Adressage immédiat
3.4.4 Adressage direct registre
3.4.5 Adressage direct mémoire (déplacement)
3.4.6 Adressage indirect mémoire
3.4.6.1 Base ou index
3.4.6.2 Base et index
3.4.6.3 Base ou index + déplacement
3.4.6.4 Base + index + déplacement
Chapitre 4
4 LE JEU D’INSTRUCTIONS
4.1 Généralité
4.2 Les instructions de base
4.2.1 L’identificateur
4.2.2 MOV
4.3 Les instructions de pile
4.3.1 PUSH
4.3.2 POP
4.3.3 PUSHA (PUSH All)
4.3.4 POPA (POP All)
4.3.5 PUSHAD (PUSH All)
4.3.6 POPAD (POP All)
4.4 Les instructions sur le registre indicateur
4.4.1 PUSHF (PUSH Flag)
4.4.2 POPF (POP Flag)
4.4.3 LAHF (Load AH from Flag)
4.4.4 SAHF (Store AH into Flag)
4.5 Les instructions de transferts accumulateur
4.5.1 IN (INput from port)
4.5.2 OUT (OUTput to port)
4.5.3 XLAT
4.6 Les instructions arithmétiques
4.6.1 L’addition
4.6.1.1 ADD
4.6.1.2 ADC (Add with Carry)
4.6.1.3 INC (INCrement)
4.6.2 La soustraction
4.6.2.1 SUB (SUBstract)
4.6.2.2 SBB (SUBstract with Below)
4.6.2.3 DEC (DECrement)
4.6.3 La multiplication
4.6.3.1 MUL (MULtiply)
4.6.3.2 IMUL (signed Integer MULtiply)
4.6.4 La division
4.6.4.1 DIV (DIVise)
4.6.4.2 IDIV (signed Integer DIVision)
4.6.4.3 CMP (CoMPare)
4.6.5 Ajustement de données
4.6.5.1 AAA (Ascii Adjust for Addition)
4.6.5.2 AAS (Ascii Adjust for Subtraction)
4.6.5.3 AAM (Ascii Adjust for Multiplication)
4.6.5.4 AAD (Ascii Adjust for Division)
4.6.6 Conversion de type
4.6.6.1 CBW (Convert Byte to Word)
4.6.6.2 CWD (Convert Word to Doubleword)
4.6.6.3 CWDE (Convert Word to Extended Doubleword)
4.6.6.4 CDQ (Convert Doubleword to Quadword)
4.6.6.5 NEG (NEGation)
4.7 Les instructions logiques
4.7.1 AND (ET logique)
4.7.2 OR (OU logique)
4.7.3 XOR (OU eXclusif)
4.7.4 TEST (TEST for bit pattern)
4.7.5 NOT
4.8 Les instructions de décalages et de rotations
4.8.1 SHR (SHift Right)
4.8.2 SHL (SHift Left)
4.8.3 SAR (Shift Arithmetic Right)
4.8.4 SAL (Shift Arithmetic Left)
4.8.5 ROR (ROtate Right)
4.8.6 ROL (ROtate Left)
4.8.7 RCR (Rotate trought Cary Right)
4.8.8 RCL (Rotate trought Cary Left)
4.9 Ruptures de séquence
4.9.1 Les branchements inconditionnels
4.9.1.1 JMP (JUmP)
4.9.1.2 INT (INTerrupt)
4.9.2 Les branchements conditionnels
4.9.2.1 Les tests d’indicateurs
4.9.2.2 Les test de nombres non signés
4.9.2.3 Les tests de nombres signés
4.9.3 Les boucles
4.9.3.1 LOOP
4.9.3.2 LOOPE (LOOP while Equal)
4.9.3.3 LOOPNE
4.9.4 Les appels ou retours de sous-programmes
4.9.4.1 PROC (PROCedure)
4.9.4.2 ENDP (END Procedure)
4.9.4.3 CALL
4.9.4.4 RET (RETurn)
4.9.4.5 IRET (Interrupt RETurn)
4.10 Les opérations sur les chaînes
4.10.1 CLD (CLear Direction flag)
4.10.2 STD (STore Direction flag)
4.10.3 MOVSB (MOVe String Byte)
4.10.4 MOVSW (MOVe String Word)
4.10.5 MOVSD (MOVe String Double)
4.10.6 LODSB (LOaD String Byte)
4.10.7 LODSW (LOaD String Word)
4.10.8 LODSD (LOaD String Double)
4.10.9 CMPSB (CoMPare String Byte)
4.10.10 CMPSW (CoMPare String Word)
4.10.11 CMPSD (CoMPare String Double)
4.10.12 STOSB (STOre String Byte)
4.10.13 STOSW (STOre String Word)
4.10.14 STOSD (STOre String Double)
4.10.15 REP (REPeat)
4.10.16 REPE (REPeat while Equal)
4.10.17 REPNE (REPeat while Not Equal)
4.10.18 REPZ (REPeat while Zero)
4.10.19 REPNZ (REPeat while Not Zero)
4.10.20 SCASB (SCAn String Byte)
4.10.21 SCASW (SCAn String Word)
4.10.22 SCASD (SCAn String Double)
4.11 Les instructions de gestion des adresses
4.11.1 LEA (Load Effective Address)
4.11.2 LES (Load Extra Segment)
4.11.3 LDS (Load Data Segment)
4.12 Déclaration de données
4.12.1 DB (Define Byte)
4.12.2 DW (Define Word)
4.12.3 DD (Define Double)
4.12.4 DQ (Define Quadword)
4.12.5 EQU (EQUivalent)
Chapitre 5
5 EXEMPLES
5.1 Pour débuter
5.2 Transfert de chaînes
5.3 Ecriture directe à l’écran
5.4 Lecture de chaîne et affichage

Chapitre 1
1 Rappel : les systèmes de numération
1.1 Le binaire
On a choisis d’associer au bit le plus à droite d’un paquet de bit, aussi appelé bit de poids faible, la valeur 2^0 = 1, le bit venant à sa gauche représentant une valeur deux fois plus élevée, 2^1 = 2 ainsi de suite….jusqu’au bit le plus à gauche, aussi appelé le bit de poids fort.
à la valeur binaire 1011 correspond donc la valeur décimale 11.
Par la suite pour éviter, tout malentendu on notera les valeurs binaires avec un % devant, 11 (décimal) s’écrira donc %1011 en binaire.
Cette notation est utilisée dans de nombreux langages de programmation ( pour l’assembleur, on fera suivre la valeur binaire de b , 11 (décimal) s’écrira 1011b).Si on regroupe 8 variables logiques ( 8 bits) on pourra représenter des nombres qui évolueront entre:
– %00000000 = 0 en décimal
– %11111111 = 128+64+32+16+8+4+2+1 = 255 en décimal.
1.2 L’hexadécimal
Tous comme on peut dire que le binaire constitue un système de codage en base 2 ( 0 ou 1 cela fait deux états possibles ), le décimal un système en base 10 ( 0 1 2 3 4 5 6 7 8 9 => 10 états possibles ) vous l’aurez compris l’hexadécimal constitue un système base 16, pour représenter les 10 première valeurs, la notations est identique à celle du système décimal et pour les 6 autres on prend les 6 premières lettres de l’alphabet.
1.3 Opérations Arithmétiques
On peut tout comme avec le décimal effectuer des opérations standards tout comme l’addition, la soustraction, ou la multiplication:
1.3.1 L’addition :
en décimal (un rappel sûrement inutile mais qui clarifie des choses…)
Retenue 11
1er nombre 127
2eme nombre + 96
résultat 223
1.3.2 Les dépassements dans l’addition:
Visiblement, le résultat est faux, du moins c’est ce que vous dirai votre petit frère de 6 ans qui excelle au cour préparatoire.
En regardant de plus prés, on peut se rendre compte qu’il nous reste une retenue, il faut donc en faire quelque chose…
L’idée immédiate que ce cas susciterai est la bonne, il suffit de créer un 9e it, qui sera alors égal à la retenue, notre résultat s’écrit alors %100000100, ce qui donne 2^8=256 + 2^2=4 = 260 ce qui est le résultat attendu.
Comme nous le verrons, avec les microprocesseurs, il existe des instructions directement dédiées à la gestion de la retenue.

CONCLUSION : La somme de deux valeurs binaires codés sur un certain nombre de bit, peut dans certains cas créer un dépassement qui engendre une retenue.
Pour connaître le nombre de bits maximal que peut comporter le résultat, il suffit de prendre le nombre de bits de la valeur qui en compte le plus et de lui ajouter 1.
Exemple:
La somme d’un nombre codé sur 4 bits et d’un nombre codé sur 7 bits prendra donc au maximum 7+1=8 bits
Dans vos futurs programmes, il faudra toujours avoir cette notion en tête.
1.3.3 Les dépassements dans la multiplication:
La multiplication binaire, du moins pour les nombres positifs, se résout exactement comme la multiplication décimale, nous allons donc passer directement aux problèmes de dépassement. Relation apprise au collège (a^x)*(a^y)=a^(x+y).
Nous savons aussi que l’on peut représenter sur p bits 2^p valeurs différentes, par exemple sur 8 bits nous pouvons représenter 256 valeurs différentes soit de 0 à 255.

Si le lien ne fonctionne pas correctement, veuillez nous contacter (mentionner le lien dans votre message)
Initiation à la programmation en assembleur (2843 KO) (Cours PDF)
Initiation à la programmation en assembleur

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *