0% ont trouvé ce document utile (0 vote)
2 vues56 pages

Laboratoire Microprocesseur 8086 à Reva ITM

Le document fournit des informations sur un laboratoire de microprocesseur (8086), y compris : - Un aperçu des blocs internes, des registres et du processus de génération d'adresses du microprocesseur 8086. - Des détails sur les modèles de programmation en langage d'assemblage et les outils utilisés pour le développement en langage d'assemblage, y compris les éditeurs, assembleurs, lieurs et chargeurs. - Des descriptions des constructions courantes de programmation en langage d'assemblage telles que les directives, les macros et les procédures.

Transféré par

ScribdTranslations
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
2 vues56 pages

Laboratoire Microprocesseur 8086 à Reva ITM

Le document fournit des informations sur un laboratoire de microprocesseur (8086), y compris : - Un aperçu des blocs internes, des registres et du processus de génération d'adresses du microprocesseur 8086. - Des détails sur les modèles de programmation en langage d'assemblage et les outils utilisés pour le développement en langage d'assemblage, y compris les éditeurs, assembleurs, lieurs et chargeurs. - Des descriptions des constructions courantes de programmation en langage d'assemblage telles que les directives, les macros et les procédures.

Transféré par

ScribdTranslations
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

INSTITUT DE TECHNOLOGIE REVA

&
GESTION, Bangalore

IV Semestre B.E.
(CSE/ISE)

Département d'informatique &


Ingénierie et
Sciences de l'information et ingénierie
Préparé par :
Prof. Venkatesh Prasad et Prof. G. C. Satish, Département de CSE
L. Krishnananda, professeur adjoint, département d'ISE

Kattigenahalli, Yelahanka, Bangalore-560064


080-65687563/[Link]
Laboratoire de microprocesseur (8086) Dept de CSE/ISE, Reva ITM, Bangalore

Livres à consulter :
1. Microprocesseurs et Interfaçage - 2ème Édition, Douglas V Hall
2. Programmation en langage d'assemblage IBM PC - Peter Abel
3. Programmation de Microprocesseur X86–K R Venugopal
4. Programmation en langage d'assemblage d'IBM PC et microprocesseur avancé – Uday Kumar K

Théorie :
Un microprocesseur est un dispositif logique numérique programmable fabriqué sur un seul
Une puce VLSI capable d'effectuer un ensemble d'opérations arithmétiques et logiques selon le
instructions fournies par l'utilisateur.

Tout microprocesseur a au minimum trois blocs fonctionnels de base : Logique Arithmétique


Unité (ALU), Unité de synchronisation et de contrôle, Tableau de registres

L'utilisateur écrit ses programmes en utilisant des mots semblables à l'anglais (appelés 'mnémotechniques') et
est connu sous le nom de « programme en langage d'assemblage » (ALP).

Un logiciel appelé "Assembleur" convertit le code source d'utilisateur en forme hexadécimale/binaire (appelée

langage machine) qui est envoyé au processeur. Le processeur décode en interne


ce code binaire et effectue l'opération.

8086Diagramme de bloc interne


Le 8086 est un processeur de 16 bits ayant un bus de données de 16 bits et un bus d'adresses de 20 bits. Le schéma bloc du 8086
est comme indiqué. Cela peut être divisé en deux parties : l'Unité d'Interface de Bus (BIU) et l'Unité d'Exécution
(UE).

UNITÉ D'INTERFACE DE BUS :


L'UIB se compose de registres de segment, d'un additionneur pour générer des adresses de 20 bits et des instructions.
file de prélecture. Il est responsable de toutes les opérations du bus externe comme la récupération des opcodes, la lecture de la mémoire,
écriture mémoire, lecture/écriture I/O, etc. Une fois que cette adresse est envoyée À l'EXTÉRIEUR du BIU, les instructions et les octets de données
sont récupérés de la mémoire et remplissent une file d'attente FIFO (premier à entrer, premier à sortir) de 6 octets.

UNITÉ D'EXÉCUTION :
L'unité d'exécution se compose de : registres à usage général (mémoire tampon) AX, BX, CX et DX ;
Les registres pointeurs SP (pointeur de pile) et BP (pointeur de base) ; les registres d'index source (SI) &
registres d'index de destination (DI); le registre des drapeaux, l'UAL pour effectuer des opérations et une unité de contrôle
avec un bus interne associé. Les registres de mémoire tampon de 16 bits peuvent être divisés en deux registres de 8 bits.
AX AL, AH ; BX BL CL, CH; DX DL, DH.

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page 2 sur 56
Laboratoire de microprocesseur (8086) Dépt de CSE/ISE, Reva ITM, Bangalore

Remarque : Tous les registres ont une taille de 16 bits.

Les différents registres et leurs opérations sont listés ci-dessous :

S'inscrire Utilisations/Opérations

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département de l'ISE Page 3 de 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

AX En tant qu'accumulateur dans les opérations de multiplication et de division de mots, E/S de mots

opérations
AL En tant qu'accumulateur dans la multiplication de bytes, la division de bytes, l'entrée/sortie de bytes, traduire,

Arithmétique décimale
AH Byte Multiply, Byte Divide
BX Comme registre de base pour tenir l'adresse de la mémoire

CX Opérations sur les chaînes, en tant que compteur dans les boucles

CL En tant que compteur dans les opérations de décalage et de rotation de variables

DX Multiplier

MP 8086/8088 MEMORY

00000016
IP Pointeur d'instruction

CS Registre de segment de code


Segment de code (64 Ko)
DS Registre de segment de données

SS Registre de segment de pile


Segment de données (64 Ko)
ES Registre de segment supplémentaire

AX AH AL
Segment de pile (64 Ko)
BX Être BL

CX CE CL
Segment supplémentaire (64 Ko)
DX DH DL

SP Registre du pointeur de pile


FFFFF16
BP Registre de pointeur de rupture

OUI Registre d'index source

DI Registre d'index de destination

SR Registre d'état

--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur adjoint, département d'ISE Page4de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

L'exécution des instructions dans l'8086 :


Le microprocesseur envoie une adresse physique de 20 bits à la mémoire et récupère le premier
instruction d'un programme à partir de la mémoire. Les adresses suivantes sont envoyées SORTIE et la file d'attente est
rempli jusqu'à 6 octets. Les instructions sont décodées et d'autres données (si nécessaire) sont récupérées à partir de
mémoire. Après l'exécution de l'instruction, les résultats peuvent revenir à la mémoire ou à la sortie
périphériques selon le cas.

Format du registre des drapeaux 8086

BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
U U U U DE DF SI TF SF ZF U AF U PF U CF

U = NON DÉFINI (a)

(b)

(c)

(d)

(e)

(f)

(g)

(h)

(i)

(a) : Drapeau de retenue - défini par le report du bit de poids fort


(b) : DRAPEAU DE PARITÉ - DEFINI SI LE RÉSULTAT A UNE PARITÉ PUBLIQUE
(c) : Drapeau de transport auxiliaire pour BCD
(d) : INDICATEUR DE ZÉRO - À ACTIVER SI LE RÉSULTAT = 0
(e) : DRAPEAU DE SIGNE = MSB DU RÉSULTAT
drapeau d'étape unique
(g) : DRAPEAU D'ACTIVATION DES INTERRUPTIONS
(h) : DRAPEAU DE DIRECTION DE CHAÎNE
Drapeau de dépassement

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page5de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

Génération d'une adresse physique de 20 bits :

ADRESSE LOGIQUE

REGISTRE DE SEGMENT 0000

SERPENT

ADRESSE MÉMOIRE PHYSIQUE DE 20 BIT

Modèles de programmation :
En fonction de la taille de la mémoire occupée par le programme utilisateur, différents types d'assemblage
les modèles de langage sont définis.

MINUSCULE Toutes les données et le code dans un seul segment

PETIT un segment de données et un segment de code

MOYEN un segment de données et deux segments de code ou plus

COMPACT un segment de code et deux segments de données ou plus


GRAND n'importe quel nombre de segments de données et de code

Pour désigner un modèle, nous utilisons la directive « .MODEL ».

Outils de développement en langage d'assemblage :

ÉDITEUR
C'est un logiciel système (programme) qui permet aux utilisateurs de créer un fichier contenant de l'assemblage.
instructions et déclarations. Ex: Wordstar, éditeur DOS, éditeur Norton
Avec l'éditeur, vous pouvez également éditer/supprimer/modifier des fichiers déjà existants.
Lors de l'enregistrement, vous devez donner l'extension du fichier sous la forme « .asm ».
Suivez la syntaxe AL en tapant les programmes
L'éditeur stocke les codes ASCII pour les lettres et les chiffres saisis.
Toute déclaration commençant par un point-virgule est considérée comme un commentaire.
Lorsque vous avez tapé tout votre programme, vous devez enregistrer le fichier sur le disque. Ce fichier s'appelle
Un fichier "source", ayant une extension '.asm'. La prochaine étape consiste à convertir ce fichier source en machine.
fichier exécutable '.obj'.
--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur assistant, département d'ISE Page6de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

2. ASSEMBLEUR
Un "assembleur" est un logiciel système (programme) utilisé pour traduire le langage d'assemblage.
mnémotechniques pour les instructions correspondant aux codes binaires.
Un assembleur effectue deux 'passages' dans votre code source. Lors du premier passage, il détermine le
déplacement des éléments de données nommés, le décalage des étiquettes, etc., et place ces informations dans un
table des symboles. Lors du deuxième passage, l'assembleur produit le code binaire pour chaque instruction
et insère les décalages, etc., qui sont calculés lors du premier passage. L'assembleur vérifie pour le
corrige la syntaxe dans les instructions d'assemblage et fournit des avertissements et des erreurs appropriés
messages. Vous devez ouvrir à nouveau votre fichier avec l'éditeur pour corriger les erreurs et le réassembler
il utilisant l'assembleur. À moins que toutes les erreurs ne soient corrigées, le programme ne peut pas être exécuté dans le
prochaine étape.

L'assembleur génère deux fichiers à partir du fichier source ; le premier fichier, appelé fichier objet, ayant
une extension « .obj » qui contient les codes binaires pour les instructions et des informations sur le
adresses des instructions. Le deuxième fichier s'appelle "fichier liste" avec une extension "'.lst". Ceci
le fichier contient les instructions en langage d'assemblage, les codes binaires pour chaque instruction, et le
décalage pour chaque inst. Il indique également toute erreur de syntaxe ou dactylographie dans le programme source.
Remarque :L'assembleur génère uniquement des décalages (c'est-à-dire des adresses effectives) ; pas d'adresses physiques absolues.
adresses.

3. LIAISON :
C'est un programme utilisé pour joindre plusieurs fichiers objets en un grand fichier objet. Pour les grands programmes,
généralement, plusieurs modules sont écrits et chaque module est testé et débogué. Lorsque tous les
les modules fonctionnent, leurs modules d'objet peuvent être liés ensemble pour former un ensemble fonctionnel complet

programme.
Le programme LINK doit être exécuté sur un fichier ".obj".
L'éditeur de liens produit un fichier de lien qui contient les codes binaires de tous les modules combinés.
L'éditeur produit également un fichier de carte de liaison qui contient les informations d'adresse concernant le lié.
fichiers.
Le lieur assigne uniquement des adresses relatives à partir de zéro, de sorte que cela puisse être placé n'importe où dans
La mémoire primaire physique plus tard (par un autre programme appelé 'localisateur' ou 'chargeur'). Par conséquent, cela
Le fichier s'appelle relocalisable. L'éditeur de liens produit des fichiers de liaison avec l'extension ".exe".

Les modules d'objet de programmes utiles (comme la racine carrée, le factoriel, etc.) peuvent être conservés dans une "bibliothèque".
et lié à d'autres programmes si nécessaire.

4. CHARGEMENT
C'est un programme utilisé pour attribuer des adresses physiques absolues aux segments dans le fichier ".exe".
la mémoire. L'environnement IBM PC DOS est livré avec le programme de chargement EXE2BIN. Le ".exe"
le fichier est converti en fichier « .bin ».

--------------------------------------------------------------------
Réalisé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page7de56
Laboratoire de microprocesseur (8086) Dépt de CSE/ISE, Reva ITM, Bangalore

Les adresses physiques sont attribuées au moment de l'exécution par le chargeur. Donc, l'assembleur ne sait pas
à propos des adresses de début de segment au moment où le programme est assemblé.

5. DÉBOGUEUR :
Si votre programme ne nécessite aucun matériel externe, vous pouvez utiliser un programme appelé débogueur pour charger
et exécutez le fichier «.exe».
Un débogueur est un programme qui vous permet de charger votre programme de code objet dans le système.
mémoire, exécuter le programme et résoudre les problèmes ou déboguer. Le débogueur vous permet également de
regardez le contenu des registres et des emplacements mémoire après avoir exécuté votre programme.
Le débogueur vous permet de changer le contenu des registres et des emplacements mémoire et de relancer le
programme. De plus, il facilite la mise en place de « points d'arrêt » dans votre programme, la fonctionnalité de pas à pas, et
autres fonctionnalités faciles à utiliser.

Si vous utilisez une carte SDK 86 prototype, le débogueur est généralement appelé « programme de surveillance ».

Nous utiliserions l'outil de développement MASM 5.0 ou une version supérieure de Microsoft Inc.
MASM signifie Assembleur Macro Microsoft. Un autre assembleur, TASM (Turbo Assembler) de
Borland Inc., est également disponible.

Interface Périphérique Programmable 8255 :


Le 8255 est un circuit intégré périphérique programmable qui peut être utilisé pour interfacer un ordinateur (CPU) avec divers

types de périphériques externes tels que : ADC, DAC, moteur, LED, afficheurs à 7 segments, clavier,
Commutateurs, etc. Il a 3 ports A, B et C et un registre de mot de contrôle. L'utilisateur peut programmer l'opération.
des ports en écrivant un "mot de contrôle" approprié de 8 bits dans le registre du mot de contrôle.

Format Word de contrôle

Bits→ D7 D6 D5 D4 D3 D2 D1 D0

1 pour I/O Mode PA : PA PCU Mode PB PB PCL


direction direction direction direction
00 –mode 0 0–mode 0
0–sortie 0 –sortie 0–sortie 0 –sortie
mode1, 10/11–mode 2
1–entrée 1 –entrée 1–mode 1 1–entrée 1

Comment écrire et exécuter votre ALP en utilisant MASM ?


Étapes à suivre :
1. Tapez EDIT à l'invite de commande (C:\>\MASM\). Une fenêtre s'ouvrira avec tous les
options comme Fichier, Édition, etc., Dans l'espace de travail, tapez votre programme selon l'assemblage
syntaxe de langage et enregistrer le fichier avec une extension ".asm". (par exemple [Link])

2. Quittez l'éditeur en utilisant le menu Fichier ou en appuyant sur ALT + F + X.

3. À l'invite, tapez la commande MASM suivie de [Link] (par exemple, [Link]). Appuyez sur Entrée
appuyez sur la touche 2 ou 3 fois. L'assembleur vérifie la syntaxe de votre programme et crée un fichier ".obj" si
--------------------------------------------------------------------
Élaboré par : L. Krishnananda, Professeur adjoint, Département d'ISE Page8de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

s'il n'y a pas d'erreurs. Sinon, cela indique l'erreur avec les numéros de ligne. Vous devez corriger les erreurs en
ouvrez votre fichier avec la commande EDIT et modifiez vos instructions. Revenez à l'invite DOS
et encore assemblez votre programme en utilisant la commande MASM. Cela doit continuer jusqu'à ce que MASM
affiche "0 Erreurs Sévères". Il peut encore y avoir des "Erreurs d'Avertissement". Essayez aussi de les corriger.

4. Une fois que vous avez le fichier ".obj" de l'étape 3, vous devez créer le fichier ".exe". À l'invite, tapez
la commande LINK suivie de "[Link]" (par exemple, [Link]) puis appuyez sur la touche Entrée. (Notez que vous
doit maintenant donner l'extension comme « .obj » et non « .asm »). S'il n'y a pas d'erreurs de liaison, le lien va
créez un fichier .exe de votre programme. Maintenant, votre programme est prêt à être exécuté.

Il existe deux façons d'exécuter votre programme.


a) Si votre programme accepte des entrées utilisateur par le clavier et affiche le résultat à l'écran, alors
vous pouvez taper le nom du fichier à l'invite et appuyer sur la touche Entrée. Des messages appropriés seront
affiché.
b) Si votre programme fonctionne avec des données mémoire et si vous voulez vraiment connaître le contenu de
registres, indicateurs, emplacements mémoire assignés, codes opérationnels, etc., puis tapez CV test (nom de fichier) à la
Une autre fenêtre s'ouvrira avec votre programme, les codes machines, le contenu des registres, etc.
Maintenant, vous obtenez également un symbole > dans la fenêtre CV. Ici, vous pouvez utiliser la commande "d" pour afficher.

contenu de mémoire, la commande "E" pour entrer des données dans la mémoire et la commande "g" pour exécuter votre

programme. De plus, vous pouvez exécuter votre programme étape par étape en utilisant les options du menu. De nombreuses manières, CV

(Vue de code) est comme l'environnement Turbo C.

Une fois que vous êtes familiarisé avec l'architecture et les bases des outils de langage d'assemblage, vous pouvez commencer
taper et exécuter votre programme.

Instructions pour les exercices de laboratoire :


1. Les programmes avec commentaires sont listés pour votre référence. Écrivez les programmes dans le carnet d'observation.

2. Créez votre propre sous-répertoire sur l'ordinateur. Éditez (tapez) les programmes avec le numéro de programme et
placez-les dans votre sous-répertoire. Ayez une copie des fichiers [Link], [Link] et [Link] dans votre
sous-répertoire. Vous pouvez écrire des commentaires pour vos instructions en utilisant le symbole point-virgule (;).

3. Exécutez les programmes selon les étapes discutées précédemment et notez les résultats dans votre carnet d'observation.

4. Apportez des modifications au programme original selon les questions posées À LA FIN de chaque programme.
et observez les résultats.
5. Pour les programmes de la partie A, l'entrée-sortie se fait par le clavier et l'écran de l'ordinateur ou par la mémoire.

6. Pour les programmes de la partie B, vous avez besoin d'une carte d'interface externe. Connectez la carte à l'ordinateur en utilisant
le FRC disponible. Certaines cartes peuvent également nécessiter une alimentation externe.

7. Consultez le responsable du laboratoire / l'instructeur avant d'exécuter les expériences de la partie B.

8. L'assembleur n'est pas sensible à la casse. Cependant, nous avons utilisé la notation suivante : lettres majuscules
pour indiquer les noms d'enregistreurs, les mnémoniques et les directives d'assembleur ; les lettres minuscules pour indiquer les variables

noms, étiquettes, noms de segments et modèles.

--------------------------------------------------------------------
Élaboré par : L. Krishnananda, Professeur adjoint, Département d'ISE Page 9 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

Titre 1a. Rechercher un élément clé dans une liste de N nombres de 16 bits en utilisant la recherche binaire
algorithme

.modèle petit ; modèle de mémoire

.pile ; segment de pile

.données ; zone de segment de données. Définissez toutes les variables et messages ici

arr DW 1111H, 2112H, 3113H, 4114H, 0a115H


len DW ($-ARR)/2
clé EQU 2113H

LA CLÉ EST TROUVÉE À


POSITION
msg2 DB 10,13, 'CLÉ NON TROUVÉE ! $'

.code ; segment de code. Mettez toutes les instructions dans ce segment.

MOV AX, @données ; initialisation du segment de données


MOV DS, AX

MOV BX, 00 ; pointant vers le premier élément


MOV DX, len ; pointant vers le dernier élément
MOV CX, clé

encore : CMP BX, DX comparez les indices du premier et du dernier élément


JA échouer instruction de saut conditionnel

MOV AX, BX calculer le milieu du tableau


AJOUTER AX, DX
SHR AX, 1
DEPLACE SI, AX
AJOUTER SI, SI

CMP CX, arr [SI] comparer la clé avec l'élément du milieu


JAE grand

DEC AX chercher des éléments en dessous du milieu

MOV DX, AX ; haut=mid-1


JMP encore ; saut inconditionnel pour répéter les instructions ci-dessus

gros : JE succès

INC AX ; rechercher des éléments au-dessus du milieu


DÉPLACER BX, AX ; bas=milieu+1
JMP encore

--------------------------------------------------------------------
Rassemblé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page 10 de 56
Laboratoire de microprocesseur (8086) Dept de CSE/ISE, Reva ITM, Bangalore

succès : AJOUTER AL, 01 ; élément trouvé. Obtenez la position


AJOUTER AL, 30h ; convertir en ASCII
MOV res, AL
LEA DX, msg1 afficher la position
JMP disp

échec : LEA DX, msg2


; élément non trouvé

disp: MOV AH, 09H ; Interruption de logiciel DOS pour afficher le message
INT 21H

MOV AH, 4CH ; Interruption de logiciel DOS


INT 21H ; pour terminer le programme

FIN

Titre 1b Lire l'état de 8 bits d'entrée de l'interface du contrôleur logique et afficher FF si


il s'agit de bits de parité paire sinon afficher 00. Afficher également le nombre de 1.
données d'entrée.

.modèle petit

.pile

.donnée

pa EQU 0d400h Adresse des ports A, B et C de 8255


pb ÉQU 0d401h
pc EQU 0d402h
cr ÉQU 0d403h ; Addressant le registre de contrôle 8255

cw EQU 82h ; Mot de contrôle pour 8255. Faire de PA une sortie et de PB une entrée

Nombre de 1 = $

.code ; programme principal


; les deux premières instructions obligatoires pour tous les programmes.

MOV AX, @données ; initialiser le registre de segment de données


MOV DS, AX

MOV DX, cr Initialisation de 8255


MOV AL, cw
OUT DX, AL

MOV DX, pb ; Lecture de l'état du commutateur du contrôleur logique à travers le port B de l'8255

DANS AL, DX

--------------------------------------------------------------------
Élaboré par : L. Krishnananda, Professeur adjoint, Département d'ISE Page11sur56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

OU AL, AL ; Affecter le drapeau de parité. La valeur dans AL n'est pas changée

MOV BL, AL ; changer le statut en BL


JPO oddp

MOV DX, pa Parité Paire


MOV AL, 0ffh FF envoyé au contrôleur logique
OUT DX, AL

Compteur JMP

oddp : MOV DX, pa


MOV AL, 00h
OUT DX, AL

compte JMP

COMPTE: MOV CL, 08 Nombre maximum d'interrupteurs = 8


MOV BH, 00 Pour compter le nombre de 1 (BH) dans l'entrée
DÉPLACE CH, 00
de retour : SHR BL, 1 ; vérifier combien de commutateurs sont fermés en vérifiant BL
JNC sauter ; répéter 8 fois.
INC BH
sauter : boucle en arrière ; L'instruction LOOP décrémente le registre CX et va à l'étiquette si CX ≠ 0.

MOV DX, OFFSET msg Affichez le message en utilisant l'interruption DOS


MOV AH, 09h
INT 21h

AJOUTER BH, 30H convertir le nombre en BH en ASCII


MOV DL, BH
DÉPLACER AH, 02h ; afficher le nombre en utilisant l'interruption DOS
INT 21h

MOV AH, 4ch


INT 21h
FIN

Questions d'exercice :
1. Modifiez le prob 1a pour un ensemble de N nombres de 8 bits.
2. Modifiez le problème 1a pour accepter la valeur 'clé' de la mémoire.
3. Modifiez le problème 1b pour afficher les messages 'parité paire' et 'parité impaire' sur l'écran
4. Nommez différents algorithmes de recherche.
5. Écrivez le schéma de bloc de l'8255 PPI et expliquez.
6. Écrivez le format du mot de contrôle de l'8255 et expliquez.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page 12 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

Titre 2a. Écrire des macros ALP


(1) Lire un caractère à partir du clavier dans le module 1 (fichier 1)
; (2) Pour afficher un caractère dans le module 2 (fichier 2)
(3) Utilisez les deux modules ci-dessus pour lire une chaîne de caractères terminée par le
; retour chariot et afficher la chaîne à l'écran dans la ligne suivante

INCLURE [Link] ; inclure le fichier [Link]


INCLURE [Link] ; inclure le fichier [Link]
.modèle petit
.pile ; déclaration facultative
.données
arr DB 40 DUP (?) ; déclarant un tableau pour stocker 40 octets
Entrez la chaîne : $
La chaîne saisie est : $

.code ; programme principal


; l'étiquette pour la première instruction est optionnelle.
début : MOV AX, @données
MOV DS, AX

LEA DX, msg1 afficher une chaîne à l'écran en utilisant les interruptions DOS
MOU AH, 09h
INT 21h

MOV SI, 0 ; index de tableau pour stocker le caractère lu du clavier


retour : lire arr [SI] ; Macro invoquée pour lire un caractère
INC SI ; et stocké dans un tableau

CMP AL, 13 ; Si retour chariot aller à l'affichage


JNZ retour

LEA DX, msg2


MOU AH, 09h
INT 21h

MOV SI, 0
encore : disp arr[SI] ; Macro invoquée pour afficher un caractère à l'écran
INC SI
CMP AL, 13 jusqu'au retour à la ligne
JNZ encore
MOU AH, 4CH
INT 21H
FIN commencer ; si une étiquette est donnée au début, END doit être suivi de l'étiquette

; les codes suivants sont écrits séparément avec un nom de fichier [Link]

--------------------------------------------------------------------
Élaboré par : L. Krishnananda, Professeur adjoint, Département de l'ISE Page13de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

disp MACRO var ; définition de macro pour afficher un caractère sur l'écran

MOV DL, var


MOV AH, 02h ; Interruption logicielle DOS pour afficher un caractère à l'écran
INT 21H
FIN
lire MACRO c ; définition de macro pour lire un caractère du clavier

MOV AH, 01h ; Interruption du logiciel DOS pour lire un caractère du clavier
INT 21h
MOV c, AL valeur ASCII du caractère stocké dans la variable c
FIN
__________________________________________________

titre 2b Effectuer les opérations de compteur BCD up/down (00-99-00) et de compteur circulaire
; utilisant le Contrôleur de Logique

.modèle petit

.pile

.données

pa EQU 0d400h
pb ÉQU 0d401h
pc ÉQU 0d402h
cr ÉQU 0d403h

cw EQU 82h

.code ; programme principal

MOV AX, @données


MOV DS, AX

MOV DX, cr
MOV AL, cw ; définir le port B 8255 comme entrée et le port A comme sortie
SORTIR DX, AL

MOV BL, 00h ; BL maintient le compte pour le compteur BCD montant et descendant

MOV BH, 01h ; BH utilisé pour le compteur à anneau

de nouveau : MOV DX, pb ; lire la position du commutateur depuis le contrôleur logique en utilisant le port B

DANS AL, DX

CMP AL, 0ff h ; régler ff sur le tableau d'interface en utilisant les interrupteurs pour HAUT
compteur
--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur associé, département d'ISE Page14de56
Laboratoire de microprocesseurs (8086) Département de CSE/ISE, Reva ITM, Bangalore

JE en haut

CMP AL, 0fe h ; définir l'entrée fe pour le compteur BCD vers le bas
JE vers le bas

CMP AL, 0fc h ; définir fc entrée pour compteur anneau


JE anneau

MOUV AH, 4C h ; terminer le programme si une autre entrée de commutateur est donnée
INT 21h
déplace AL, BL Compteur BCD UP
APPELER disp Transférer le contrôle à une procédure nommée disp
AJOUTER AL, 1 compte incrémentiel
DAA ; changer le résultat en décimal après l'addition
MOU BL, AL
JMP encore ; revenez en arrière et vérifiez les entrées de commutation

déplacer : MOV AL,BL compteur BCD vers le bas


APPELER disp
SOUSTRAIRE AL, 1 ;décrémenter le compte
DAS ; changer le résultat en décimal après la soustraction
DÉPLACER BL, AL
JMP encore

anneau : MOV AL, BH Fonctionnement du compteur à anneau


APPELER disp
ROR BH, 1 décalage de bit vers la droite
JMP encore

disp PROC PROCIMITE ; procédure pour afficher le résultat sur le port 8255
MOV DX, pa
OUT DX, AL
retard d'appel ; appeler une autre procédure nommée délai
RET ; retourner au programme appelant
disp ENDP

retard PROC PROC Procédure de délai pour attendre quelques secondes


POUSSE CX ; enregistrer le contenu original des registres AX et CX sur la pile
PUSH AX
MOV CX, 2000 h ; compter pour la boucle externe dans CX
MOUV AX, 0ffff h ; compteur pour la boucle intérieure dans AX
retourner : DEC AX
JNZ retour2
BOUCLE arrière1
POP AX ; récupérer le contenu original de AX et CX avant de retourner
POP CX
RET ; retourner au programme appelé
retard ENDP Fin de la procédure de retard
FIN
--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page15de56
Laboratoire de Microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

Questions d'exercice :
1. Modifiez le problème 2a pour accepter une chaîne se terminant par un signe $.
2. Modifiez le problème 2a avec uniquement des valeurs CR ou LF et observez la sortie.
3. Modifiez le problème 2b pour n'avoir que deux options : Compteur UP/Down ou Compteur à anneau
4. Modifiez la procédure de délai prob 2b pour différents délais en faisant varier la valeur du compteur.
5. Modifiez le problème 2b pour un compteur HEX up/down et un compteur à anneau décalé vers la gauche.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Titre Trier un ensemble donné de N nombres de 8 bits dans l'ordre croissant et


ordre décroissant en utilisant l'algorithme de tri à bulles

.modèle petit

.pile

.données

liste DB 33h, 54h, 0a2h, 17h, 76h ; déclarer et initialiser un tableau d'octets
n DW $-liste longueur du tableau

commande ÉQU 0 ; ordre = 0 pour croissant (supposé)


; ordre = 1 pour décroissant

LE TABLEAU TRIÉ EST:: $

.code ; programme principal

MOV AX, @données


MOV DS, AX

MOV BX, n ; longueur du tableau (n) dans le registre BX


DEC BX ; valeur n-1 dans BX

prochainpass: MOV CX, BX valeur n-1 dans CX


MOV SI, 00H ; SI utilisé pour indexer dans le tableau

nextcomp : MOV AL, liste[SI] prendre un élément du tableau dans le registre AL


INC SI
CMP AL, liste[SI] ; comparer des éléments

SI la commande EQ 0 ; assemblage conditionnel


JBE suivant ; ordre croissant. Vérifiez les drapeaux CY et Z.
SINON
JAE suivant ; ordre décroissant
FIN SI

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département de l'ISE Page 16 sur 56
Laboratoire de microprocesseurs (8086) Département de CSE/ISE, Reva ITM, Bangalore

XCHG AL, liste [SI] échanger les éléments si nécessaire


MOUV liste [SI-1], AL

suivant : BOUCLE suivantcomp boucle interne


DEC BX
JNZ prochainpass ; boucle extérieure

; le tri est terminé

LEA DX, msg ; afficher le message


MOV AH, 09h
INT 21H
; Les instructions ci-dessous servent à afficher les éléments à l'écran
MOVE BX, n
MOUV SI, 00 ; SI comme pointeur vers l'élément du tableau

à nouveau : MOV AL, LIST[SI] prendre l'élément du tableau dans AL

APPELER déplier ; utilisez une procédure pour décompresser les chiffres du nombre

MOV AH, 02h ; garder de l'espace entre les éléments


MOV DL,' '
INT 21H

INC SI
DEC BX
JNZ encore ; répéter pour tous les éléments du tableau

MOV AH, 4Ch


INT 21H

déballer PROC NEAR procédure pour déballer les chiffres


MOV CH, AL
ET AL, 0F0h ; masquer le nibble supérieur (chiffre) du nombre
MOUV AH, AL
MOV CL, 4
SHR AH, CL échanger (intervertir) les chiffres
APPELER asciidisp ; appeler la procédure pour convertir en ascii et afficher les numéros
MOV AL, CH
ET AL, 0Fh masquer le nibble inférieur du nombre
MOV AH, AL
APPELER disp ; appeler la procédure pour convertir en ascii et afficher les nombres
RET
déballer ENDP

asciidisp PROC PROCHE procédure pour convertir en ascii et afficher les nombres
CMP AH, 0Ah ; si le chiffre est 0-9, AJOUTER 30 pour convertir en ASCII
JB plage ; Si le chiffre est A-F, AJOUTEZ 37 pour convertir en ASCII

--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur adjoint, département d'ISE Page 17 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

AJOUTER AH, 7
sauter : AJOUTER AH, 30h
MOV DL, AH
MOV AH, 02
INT 21 h
RET
asciidisp ENDP

MOV AH, 4Ch ; terminer


INT 21h

FIN

Titre 3b) lire l'état de deux entrées de 8 bits (x et y) du contrôleur logique


; interface et afficher x * y.

.modèle petit
.pile

.données
pa EQU 0d400h ; adresses de port 8255
pb ÉQU 0d401h
pc EQU 0d402h
cr ÉQU 0d403h

cw ÉQU 82h

entrez le nombre x depuis l'interface et appuyez sur Entrée :$


entrez le nombre y dans l'interface et appuyez sur Entrée :$
Produit affiché sur l'interface sous forme binaire : appuyez sur n'importe quelle touche pour sortir$

.code ; programme principal


;l'étiquette de début est optionnelle
début : MOV AX, @données
DÉPLACER DS, AX

MOV DX, cr ;initialiser les ports 8255


MOV AL, cw
OUT DX, AL

MOV DX, OFFSET msg1 afficher le message


MOV AH, 09h
INT 21h

DÉPLACER AH, 01h appuyez sur une touche pour continuer


INT 21h

MOV DX, pb ; lire le premier numéro (état de l'interrupteur) via le port B de 8255
--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur assistant, département d'ISE Page 18 de 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

DANS AL, DX
MOV BL, AL ; premier nombre copié dans le registre BL
MOV DX, OFFSET msg2 ; afficher le prochain message
MOV AH, 09h
INT 21h
MOV AH, 01h ; appuyez sur une touche pour continuer

INT 21h

MOV DX, pb ;lire le deuxième nombre


DANS AL, DX
; les deux données lues. Maintenant, multipliez-les

MUL BL ; produit 16 bits dans le registre AX


MOV DX, pa
SORTIE DX, AL envoyer le chiffre inférieur du produit
MOV BL, AH

MOV DX, OFFSET msg3 ;afficher le message


MOV AH, 09h
INT 21h

MOV AH, 01H appuyez sur n'importe quelle touche

INT 21h
DÉPLACE AL, BL ; envoyer le chiffre supérieur
MOV DX, pa
OUT DX, AL
MOV AH, 4Ch ;terminer
INT 21h

retard PROC PROCHE ; procédure de délai

PUSH CX
PUSH AX
MOV CX, 2000h
MOV AX, 0ffffh
retour2 : DEC AX
JNZ back2
BOUCLER retour1
POP AX
POP CX
RET
retard ENDP
FIN début
Questions d'exercice :
1. Modifier le problème 3a pour un ensemble de N nombres sur 16 bits.

2. Modifiez le problème 3b pour obtenir le produit en décimal et l'afficher.


3. Nommez différents algorithmes de tri.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page19de56
Laboratoire de Microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

7a) Lisez votre nom à partir du clavier et affichez-le à un emplacement spécifié


; sur l'écran devant le message "quel est votre nom". Effacez l'écran
; avant l'affichage.

.modèle petit

.pile

lirestr MACRO loc ; macro pour lire un caractère


MOV AH, 01H
INT 21H
MOV loc, AL
FIN
clrscr MACRO ; macro pour effacer l'écran
MOUV AL, 2 ; effacer l'écran en utilisant l'interruption BIOS
MOV AH, 0
INT 10H
FIN

.données
msg0 DB 10, ' ENTREE DU NOM:$'
DB QUEL EST VOTRE NOM ?
DB 10, '$' ;insérer un saut de ligne

len DW ($-msg1)
arr DB 40 DUP(?)

afficher MACRO str ; définition de macro pour afficher une chaîne à l'écran
LEA DX, str
MOV AH,9
INT 21H
FIN

.code ; programme principal

début : MOV AX, @données


MOVE DS, AX
MOV SI, 00 ; SI est un pointeur de tableau

afficher ;invoker macro pour afficher le message

retour : lirestr arr[SI] ;LIRE LE NOM À PARTIR DU CLAVIER


INC SI
CMP AL, 13 ; et stocker dans un tableau
JNZ arrière
MOV arr[SI],'$' ; FIN du caractère de fin de chaîne inséré

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur associé, Département d'ISE Page20de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

effacer écran ; invoquer la macro pour effacer l'écran

Positionnez le curseur sur l'écran


MOV BH, 0 ; utilisant l'interruption BIOS
MOV DH, 13 ; coordonnée de ligne
MOV DL, 28 coordonnée de colonne
MOV AH, 2
INT 10H

afficher msg1 ;invoquer la macro pour afficher le message

MOV SI, 0 ;index du tableau


LEA DX, arr[SI] ; lire le nom du tableau et afficher
MOV AH, 09H
INT 21H

afficher msg2 ;invoquer la macro pour afficher le message

MOV AH, 4CH


INT 21H

FIN début

7B) Piloter une interface de moteur pas à pas pour faire tourner le moteur dans le sens des aiguilles d'une montre
par N étapes

.modèle petit

.pile

.données
pa EQU 0d400h Adresse des ports 8255
pb ÉQUI 0d401h
pc ÉQU 0d402h
cr ÉQU 0d403h Adresse du registre de contrôle 8255

cw EQU 80h Commande de contrôle pour 8255 pour rendre tous les ports en sortie
n ÉQU 50 ; nombre de rotations. N=50 est une rotation
PHASE_A ÉQU 88H modèle pour énergiser les enroulements du moteur

.code

début : MOV DX, cr


MOV AL, cw
OUT DX, AL
MOV CX, n

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page21de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

à nouveau : MOV BL, 4


MOV AL, PHASE_A ; charger le motif dans AL
en haut MOV DX, pa
OUT DX, AL enflammer l'enroulement du moteur
Délai d'appel

ROR AL, 1 rotation dans le sens des aiguilles d'une montre

DEC BL
JNZ vers le haut

BOUCLE encore

MOV AH, 4CH


INT 21H

retard PROC PRÈS ; procédure de délai


DÉPLACER SI, 1000h
retour2 : MOV DI, 0FFFH
DEC DI
JNZ retour1
DEC SI
JNZ retour2
RET
retard FIN

FIN début

Questions d'exercice :
1. Modifiez le problème 7a pour afficher le nom caractère par caractère.
2. Écrire un code pour effacer l'écran.
3. Modifiez le problème 7b pour faire tourner le moteur (i) 2 rotations (ii) 5 rotations
4. Modifiez les comptes de délai de la question 7b et observez la vitesse du moteur.
5. Écrivez une note sur les interruptions DOS.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

8a) Calculer le Factoriel d'un Entier Positif 'N' en Utilisant une Procédure Récursive

.modèle petit

.pile

.données
num DW 5 le nombre dont la factorielle est nécessaire
rés DW ? ; pour stocker le résultat

LE FACTORIEL DE
msg1 DB EST : $
--------------------------------------------------------------------
Rédigé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page22de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

msg2 DB 10,13, 'la factorielle de 0 est 1 $'

afficher MACRO str ; définition de macro pour afficher une chaîne à l'écran
LEA DX, str
MOV AH, 9
INT 21H
FIN
.code ; programme principal

MOV AX, @data


MOV DS, AX
MOV CX, num
AJOUTER CX, 3030h
MOV msg1, CL ; stocker la valeur ASCII du nombre en mémoire

CMP num, 0 ; si le nombre est 0, la factorielle est 1


JE dernier ; sinon calculez la factorielle

MOUV AX, 01H


APPELER le fait ; transférer le contrôle à la procédure nommée fact
MOV res, AX ; résultat copié dans la mémoire

afficher msg ; invoquer la macro pour afficher le message

MOV AX, res ; utilisez une procédure pour déballer les chiffres du résultat
APPELER déballer
JMP arrêt

dernière : afficher msg2 invoker la macro pour afficher le message

arrêter : MOV AH,4CH


INT 21H

fait PROC PROCHE ; procédure pour trouver la factorielle


MUL num
NUM DÉC
JZ terminé
APPELER le fait appel récursif de la même procédure
sur : RET ; résultat dans le registre AX
fait ENDP

décompresser PROC PROC PROC PROC PROC procédure


PROC PROC pourPROC PROC PROC
décompresser PROC PROC PROC PROC
les chiffres

MOV BX, AX
ET AH, 0F0H ; masquer le chiffre le plus à gauche (MSD)

MOV AL, AH
DÉPLACER CL, 4

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur Assistant, Département de l'ISE Page23de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

SHR AL, CL
APPELER asciidisp ; utilisez une autre procédure pour convertir en ASCII et afficher
DÉPLACER AX, BX
ET AH, 0FH ; masquer le chiffre suivant
DEPLACE AL, AH
APPELER disp
MOV AX, BX
ET AL, 0F0H ; masquer le chiffre suivant

SHR AL, CL
APPELER disp
MOV AX, BX
ET AL, 0FH ; maks chiffre le plus à droite (LSD)
APPELER disp
RET

déballer ENDP

asciidisp PROC PROCIMITE ; procédure pour obtenir la valeur ascii


CMP AL, 0AH ; et pour afficher le nombre à l'écran
JB sauter
AJOUTER AL, 7
sauter : AJOUTER AL, 30H
MOV DL, AL
MOU AH, 02
INT 21H
RET
asciidisp FIN

FIN
_______________________________________________________

8B) Piloter une interface de moteur pas à pas pour faire tourner le moteur dans le sens antihoraire
direction par N étapes

.modèle petit

.piler

.données
pa EQU 0d400h Adresse des ports 8255
pb ÉQU 0d401h
pc ÉQU 0d402h
cr ÉQU 0d403h Adresse du registre de contrôle 8255

cw ÉQU 80h Mot de contrôle pour le 8255 pour rendre tous les ports en sortie
n ÉQU 50 ; nombre de rotations. N=50 est une rotation
PHASE_A ÉQU 88H modèle pour électriser les enroulements du moteur

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page 24 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

.code ; programme principal


début : MOV DX, cr
MOV AL, cw
SORTIE DX, AL
MOV CX, n

à nouveau : MOV BL, 4


MOUV AL, PHASE_A ; charger le motif dans AL
en haut MOV DX, pa
OUT DX, AL énergiser l'enroulement du moteur
Délai d'appel attendre avant d'envoyer l'impulsion à l'enroulement suivant
ROL AL, 1
DEC BL
JNZ haut
BOUCLE encore ; répéter pour tous les n étapes
MOU AH, 4CH
INT 21H

retard PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC

MOV SI, 2000h


retour2 MOV DI, 0FFFH
back1 DEC DI
JNZ retour1
DEC SI
JNZ retour2
RET
retard ENDP
FIN début

Questions d'exercice :
1. Modifiez le problème 8a pour obtenir la factorielle sans utiliser une procédure récursive.
2. Modifiez le problème 8a pour afficher le facteur de 0 et 1 sans calculer et pour les autres.
nombres (2 - 8) cela devrait calculer.
3. Modifiez le problème 8a pour vérifier si l'entrée >8 et afficher une condition d'erreur.
4. Est-il possible de faire tourner le moteur dans le problème 8b sans utiliser l'instruction ROL ? Si oui, écrivez
le code complet.
5. Écrivez une note sur les interruptions BIOS.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

9a) CALCULER nCr EN UTILISANT UNE PROCÉDURE RECURSIVE. ASSUMEZ QUE 'n' ET 'r' SONT
NOMBRE ENTIERS NON NÉGATIFS.

.modèle petit
.pile
.données
--------------------------------------------------------------------
Réalisé par : L. Krishnananda, Professeur adjoint, département de ISE Page 25 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

n DW 5 valeur de n
r DW 3 valeur de r
ncr DW 1 ; pour stocker le résultat

Le nCr est : $
Erreur ! La valeur n ne peut pas être zéro !

afficher MACRO str ; définition de macro pour afficher une chaîne à l'écran
LEA DX, str
MOV AH, 9
INT 21H
FIN
.code
; programme principal
début : MOV AX, @données
MOV DS, AX

CMP n, 0 ; si n=0, condition d'erreur


Erreur JZ

MOUV BX, n ; BX a une valeur de n


INC BX
DÉPLACER CX, r CX a une valeur de r
APPELER ncp transférer le contrôle à la procédure

afficher msg ; invoquer la macro pour afficher le message

MOV AX, ncr ; copier le résultat dans le registre AX


APPELER déballer ; utiliser une procédure pour décompresser les chiffres

JMP arrêt

erreur : afficher msg1 ; invoquer une macro pour afficher un message

arrêt : MOV AH,4CH


INT 21H

ncp PROC PROCHE ; procédure pour trouver la valeur de ncr


CMP CX, 00H
JE sur ; si r=0, la valeur de ncr est 1
PUSH CX
DEC CX
APPELER NCP
MOV AX,BX
POP CX
SOUSTRAIRE AX,CX

MUL NCR
DIV CX
DÉPLACER NCR, AX

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page26de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

au-dessus : RET
ncp ENDP

déballer PROC NEAR ; procédure pour décompresser les chiffres


MOV BX, AX
ET AH, 0F0H ; masquer le chiffre le plus à gauche (MSD)
DEPLACE AL, AH
MOUV CL, 4
SHR AL, CL
APPELER disp ; utilisez une autre procédure pour convertir en ASCII et afficher
DÉPLACER AX, BX
ET AH, 0FH ; masquer le chiffre suivant

MOV AL, AH
APPELER disp
MOV AX, BX
ET AL, 0F0H ; masquer le chiffre suivant

SHR AL, CL
APPELER disp
MOV AX, BX
ET AL, 0FH ; maks chiffre le plus à droite (LSD)
APPELER disp
RET
déballer ENDP

disp PROC PROCIMÉE ; procédure pour obtenir la valeur ascii


CMP AL, 0AH ; et pour afficher le nombre à l'écran
JB saute
AJOUTER AL, 7
SAUTER : AJOUTER AL, 30H
MOV DL, AL
MOV AH, 02
INT 21H
RET
disp ENDP

FIN début
_____________________________________________

titre 9B) Contrôler une interface de moteur pas à pas pour faire tourner le moteur N étapes dans le sens des aiguilles d'une montre

; et N étapes dans le sens antihoraire

.modèle petit

.pile

.données
pa EQU 0d400h Adresse des ports 8255
pb ÉQU 0d401h
--------------------------------------------------------------------
Compilation par : L. Krishnananda, professeur assistant, département d'ISE Page27de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

pc EQU 0d402h
cr ÉQU 0d403h Adresse du registre de contrôle 8255
cw EQU 80h Mot de contrôle pour 8255 pour configurer tous les ports en tant que sortie
n1 ÉQU 50
n2 ÉQU 75 ; nombre de rotations. N = 50 est une rotation

PHASE_A ÉQU 88H ; motif pour dynamiser les enroulements du moteur


PHASE_D EQU 11H

.code
début : MOV DX, cr
MOV AL, cw
OUT DX, AL

MOV CX, n1 pour la rotation horaire du moteur


clockw : MOV BL, 4
MOV AL, PHASE_A
up1 MOV DX, pa
OUT DX, AL
Délai d'appel

ROR AL, 1
DEC BL
JNZ en haut1
montre LOOP

MOV CX, n2 pour la rotation antihoraire du moteur


anticlk : MOV BL, 4
MOV AL, PHASE_D
up2: MOV DX, Pa
SORS DX, AL
Délai d'appel
ROL AL, 1
DEC BL
JNZ up2
BOUCLE anti-horaire
DÉPLACER AH, 4CH
INT 21H
retard PROC PROCIMITE
MOV SI, 1000h
retour2 : MOV DI, 0FFFH
DEC DI
JNZ retour1
DEC SI
JNZ retour2
RET
retard FIN
FIN début
--------------------------------------------------------------------
Compilation par : L. Krishnananda, Professeur Assistant, Département d'ISE Page 28 de 56
Laboratoire de Microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

Questions d'exercice :
1. Modifiez le problème 9a avec une autre logique (mathématiquement) pour trouver nCr.
2. Modifiez le problème 9a pour vérifier si r > n et, si oui, imprimez une condition d'erreur.
3. Modifiez le prob 9b pour faire tourner le moteur soit dans le sens horaire soit dans le sens antihoraire, selon le
touche pressée du clavier.
4. Quels sont les usages des moteurs pas à pas ?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

titre 10a) Vérifiez si une sous-chaîne donnée est présente ou non dans une chaîne principale.
; caractères.

.modèle petit

.pile

disp_msg MACRO str ; macro pour afficher une chaîne à l'écran


LEA DX, str ; en utilisant des interruptions DOS

MOV AH, 09h


INT 21H
FIN

lire MACRO str macro pour lire une chaîne depuis le clavier
LEA DX, str
MOV AH, 0AH
INT 21H
FIN

.données
DB 10, 13, 'ENTRER LA CHAÎNE PRINCIPALE:$'
msg2 DB 10, 13, 'ENTREZ LA SOUS CHAÎNE:$'
msg3 DB 10, 13, 10, ' Félicitations !! LA SOUS-CHAÎNE EST TROUVÉE : *** ', 10, '$'
msg4 DB 10, 13, 10, ' Désolé !! LA SOUS-CHAÎNE N'EST PAS TROUVÉE : !!! ', 10, '$'

z DB 50H ; tableau pour stocker la chaîne principale

DB 0H
DB 50H DUP (?)
y DB 50H ; tableau pour stocker une sous-chaîne
DB 0H
DB 50H DUP (?)
.code

début : MOV AX, @données


MOV DS, AX
disp_msg msg1 ; invoquer une macro pour afficher un message
lire z ; invoquer la macro pour lire une chaîne principale
msg2
lire y ; invoquer la macro pour lire la sous-chaîne

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département de l'ISE Page 29 de 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

MOV CL, z + 1 ; longueur de la chaîne principale dans le registre CL

LEA SI, z+2 ; pointer vers la chaîne principale


retour2 : POUSSER SI
LEA DI, y+2 ; pointer vers la sous-chaîne
MOV CH, y+1 longueur de la sous-chaîne dans le registre CH
MOV BH, 00H
MOU AL, [SI]
CMP AL, [DI] Comparer les caractères des deux chaînes
JNE nextword ; si pas égal, passer au mot suivant de la chaîne
INC SI
INC DI
INC BH
CMP BH, y+1 ; répéter jusqu'à ce que tous les caractères de la sous-chaîne aient été comparés

JE trouvé ; si tous les caractères sont égaux, afficher msg1


DEC CH
JNZ retour1

mot suivant
POP SI
INC SI
DEC CL
CMP CL, 00H
JNE back2 ; après toutes les comparaisons, si non trouvé afficher msg4
msg4 ; invoquer la macro
JMP arrêt
trouvé : disp_msg msg3 ; invoquer la macro pour afficher msg3

arrêter MOV AH,4CH


INT 21H
FIN début

10b) Scanner un clavier 8 X 3 pour la fermeture de touche et stocker le code de la touche


; pressé dans l'emplacement mémoire ou affiché à l'écran. Afficher la ligne et la colonne
numéros de la touche pressée.

.modèle petit

.pile

clrscr MACRO ; définition de macro pour effacer l'écran


MOVE AL, 2 ; en utilisant la fonction d'interruption BIOS

MOV AH, 0
INT 10h
FIN

--------------------------------------------------------------------
Compile par : L. Krishnananda, Professeur Assistant, Département d'ISE Page30de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

mdisp MACRO str ; définition de macro pour afficher un message


LEA DX, str
MOU AH,9
INT 21H
FIN
cdisp MACRO ; définition de macro pour afficher un caractère/un nombre
AJOUTER AL, 30H
MOV DL, AL
MOV AH, 02h
INT 21h
FIN
OUT_pc MACRO ; définition de macro pour sortie vers le clavier
MOUV DX, PC
SORTIE DX, AL
FIN
dans_pa MACRO ; définition de macro pour lire à partir du clavier
MOV DX, pa
DANS AL,DX
FIN

.données
PROGRAMME DE DÉMONSTRATION POUR L'INTERFACE CLAVIER
appuyez sur une touche de l'interface du clavier pour connaître le numéro de ligne et de colonne...
Ce programme est en cours d'exécution... Appuyez sur n'importe quelle touche de l'ordinateur pour QUITTER. $
La touche pressée est :
numéro de ligne :
Colonne n°: '$'

clés DB '0 1 2 3 4 5 6 7 8 9 . + - X / % ACCECK= MCMRM-M+','$'


Afficher DB '01','$'

pa EQU 0D400h
pb EQU 0D401h
pc ÉQU 0D402h
cr ÉQU 0D403h
.code

début : MOV AX, @data


MOV DS, AX

effacer l'écran ; invoquer la macro pour effacer l'écran


mdisp msg1 ; invoquez la macro pour afficher les messages
mdisp msg2
mdisp msg3

MOV AX, 90h ;Initialiser le Port A - Entrée, CU & CL - Sortie


SE MOV DX, cr
SORTIE DX, AX Écrire au registre de contrôle de 8255
--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page31of56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

getkey
MOV BH, 1h Lignes de scan
MOV BL, 0h Initialiser un compteur. Il contient le numéro de la clé

lignes de balayage

MOV AL, BH
SORTIE_pc ;invoke macro to send Line Number to Port CL
en_pa ;invoquer la macro pour lire depuis le Port A

DÉPLACER CH, AL ; CH A la valeur indiquant la touche pressée


MOV AL, 0H

vérifier ; Initialiser le compteur


; Maintenant, vérifiez à plusieurs reprises quelle touche a été sélectionnée.

MOV CL, CH
ET CL, 01h ; masquer tous les bits sauf le bit de poids faible

CMP CL, 01h


JZ affichage ; Si ce bit est défini, la touche est enfoncée
INC BL ; sinon vérifiez le bit suivant en décalant la valeur de CH
SHR CH, 01h
INC AL
CMP AL, 08h Si tous les bits ne sont pas comparés,
Vérification JNZ ; revenir pour la ligne de scan suivante

SHL BH, 01h Passer à la ligne de scan suivante


CMP BH, 10h
lignes de scan JNZ Répétez la boucle des lignes SCAN (4 fois)
Boucle JMP

afficher Afficher la touche sélectionnée


PUSH AX
mdisp msg5 ; invoquer la macro
MOV AL, BH

cdisp
mdisp msg6
POP AX
cdisp
msg4

MOV AX, 0h
MOUV AL, BL
MOV BL, 02h
MUL BL
DÉPLACER BX, AX
MOV DI, OFFSET Show
MOV AL, Keys[BX]
--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page32de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

MOV Show [0h], AL


MOV AL, Clés[BX + 1h]
MOV Afficher [1h],AL
;Affiche le caractère pressé.
mdisp afficher
Délai d'appel
boucle de sortie

MOV AH, 01h


INT 16h appuyez sur une touche pour quitter

JNZ suivant
JMP obtenir une clé
suivant : MOV AH,4ch ;Quittez le programme en toute sécurité.

INT 21h

délai PROC PROC ; procédure de retard


MOUV CX, 0FFFFh
back2 : MOV AX, 0FFh ; boucle extérieure
DÉC AX ; boucle intérieure
JNZ retour1
BOUCLE retour2
RET
retard ENDP

FIN début ;c'est la FIN de votre programme.

Questions d'exercice :
1. Modifiez le problème 10a pour imprimer la longueur de la chaîne principale et de la sous-chaîne.
2. Modifiez le problème 10b pour afficher le numéro de ligne en commençant à partir de 0.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11a) Générer les premiers 'n' nombres de Fibonacci

.modèle petit

.pile

.données
arr DW 0,1,50 DUP (?) ; tableau pour stocker les nombres de Fib
; arrdec DW 0,1, 50 DUP (?) ; tableau pour stocker les nombres de Fibonacci décimaux
compter DW 15 combien de nombres générer

.code

début : MOV AX, @données


MOV DS, AX

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur assistant, Département d'ISE Page 33 de 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

DÉPLACE SI, 0
MOV CX, compte
; génération de nombres fib HEX

retour: MOV AX, arr[SI] prendre le premier numéro de la mémoire


AJOUTER AX, arr[SI+2] ; Ajoutez-le au deuxième nombre
MOV arr[SI+4], AX ; stocker la somme à l'emplacement suivant
AJOUTER SI, 2 ; incrémenter le pointeur
RETOURNER ; répéter jusqu'à ce que le compte soit terminé
Résultat hexadécimal stocké en mémoire

; pour générer des nombres de Fibonacci décimaux, utilisez le code suivant et


utilisez l'emplacement mémoire arrdec.

; LEA DI, arrdec


; MOV CX, compte
; XOR AX, AX
; arrière: MOV AL, BYTE PTR [DI]
; AJOUTER AL, BYTE PTR [DI+2]
; DAA
; MOUV BYTE PTR [DI+4], AL
; MOV AL, BYTE PTR [DI+1]
; ADC AL, BYTE PTR [DI+3]
; DAA
; DEPLACEZ LE BYTE PTR [DI+5], AL
; AJOUTER DI, 2
; Boucle de retour

MOV AH, 4Ch


INT 21h
FIN début
_____________________________________________________________--
TITRE 11b) Scanner un clavier 8 X 3 pour fermer une touche et simuler
; ADDITION et SOUSTRACTION comme dans une calculatrice.

.modèle petit

.pile

clrscr MACRO
MOV AL, 3
MOV AH, 0
INT 10h
FIN

--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur adjoint, département d'ISE Page34de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

mdisp MACRO str


LEA DX, str
DÉPLACER AH, 9
INT 21H
FIN
cdisp MACRO
MOV DL, AL
MOV AH, 02h
INT 21h
FIN
.données

pa EQU 0d400h
pb ÉQU 0d401h
pc ÉQU 0d402h
cr ÉQU 0d403h

Entrez la valeur X et appuyez sur une touche du clavier de l'ordinateur : $


msg2 DB 10,13, 'Entrez la valeur Y et appuyez sur une touche du clavier de l'ordinateur :$'
msg3 DB 10,13, 'Opérateur d'entrée : +/- $'
msg4 DB 10,13, 'Résultat = $'

0123456789.+-*/%c$
base de données 4

.code

MOV AX, @données


DÉPLACER DS, AX

MOV DX, cr
MOV AL, 90h ;initialiser le port A 8255 en entrée
SORTIE DX, AL ; et d'autres ports comme sortie

MOV DI, OFFSET inp

mdisp msg1
Délai d'appel
Délai d'appel
APPELER keypress utiliser une procédure pour obtenir le premier numéro de l'interface du pavé numérique

POUSSE AX
MOV AH, 07h appuyez sur une touche pour continuer
INT 21h
POP AX

mdisp msg2
INC DI

--------------------------------------------------------------------
Rédigé par : L. Krishnananda, Professeur adjoint, Département de l'ISE Page35de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

délai d'appel
Délai d'appel
APPELER keypress utilisez une procédure pour obtenir le deuxième nombre de l'interface du clavier

PUSH AX
MOV AH, 07h
INT 21h
POP AX

mdisp msg3
INC DI

Délai d'appel
Délai d'appel
APPELER pression de touche ; utiliser une procédure pour obtenir l'opérateur - ou + à partir de l'interface du clavier

PUSH AX
MOV AH, 07h
INT 21h
POP AX

mdisp msg4

MOV AL, [DI-2]


SOUSTRAIRE AL, 30h

MOV BL, [DI-1]


SUB BL, 30h
MOV DL, [DI]
CMP DL, '+' ; vérifier l'opérateur. SI +, faire l'addition, si - faire la soustraction
JNZ subt
AJOUTER AL, BL ; addition. résultat en décimal
DAA
Sortie JMP
soustraire : SUB AL, BL
DAS ; soustraction. résultat en décimal

sortie : MOV DL, AL ; afficher le résultat à l'écran en le convertissant en ASCII


ET AL, 0f0h
MOV CL, 04h
SHR AL, CL
AJOUTER AL, 30h
POUSSEZ DX
cdisp ; invoquer la macro
POP DX
MOV AL, DL
ET AL, 0fh
AJOUTER AL, 30h
cdisp ; invoquer la macro

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page36de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

MOV AH, 4ch


INT 21h

keypress PROC PROC PROCHE ; procédure pour scanner le clavier afin de lire les chiffres et l'opérateur

répéter : MOV DX, pc


MOV AL, 01h ; sélectionner une ligne de clavier
SORTIE DX, AL
MOV DX, pa lire la colonne de cette ligne
DANS AL, DX
CMP AL, 00
JZ suivant ; si aucune touche enfoncée, vérifier dans la ligne suivante

JMP f_c
suivant : MOV DX, pc
MOV AL, 02h
OUT DX, AL
MOV DX, pa
DANS AL, DX
CMP AL, 00
JNZ s_c
Répéter JMP
f_c Délai d'appel
MOV SI, OFFSET disp1
suivant1: SHR AL, 1
JC suivant ; si une touche est enfoncée, l'afficher
INC SI
JMP suivant1
s_c retard d'appel
MOV SI, OFFSET disp1
AJOUTER SI, 08h
SHR AL, 1
JC suivant
INC SI
JMP next2
nextc : MOV DL, [SI]
MOV AH, 2h
INT 21h
MOV [DI], DL
RET
touche de fin

retard PROC PROC ;procédure de délai


PUSH AX
PUSH CX
MOV CX, 80h
retour2 : MOV AX, 1000h
reculer AX
--------------------------------------------------------------------
Rédigé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page37de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

JNZ retour1
BOUCLE back2
POP CX
POP AX
RET
retard FIN

FIN début
Questions d'exercice :
1. Modifiez le prob 11a pour afficher les nombres de Fibonacci à l'écran.
2. Modifiez le problème 11b pour inclure également l'opération de multiplication.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

15a (i) Programme pour créer un fichier en utilisant les interruptions DOS.

.modèle petit

.pile

Disp MACRO str


LEA DX, str
MOV AH, 09h
INT 21h
FIN

.données
fichier DB 'd:\mpa_09\[Link] $'
Création réussie $
Échec de la création $

.code

MOV AX, @données


MOV DS, AX

MOV AH, 3ch ; Fonction DOS pour créer un fichier


MOV CX, 00h ; attributs de fichier dans le registre CX

LEA DX, fichier


INT 21h

Erreur JC
afficher msg1 ; invoquer une macro pour afficher des messages
JMP arrêt

erreur : affichage msg2

--------------------------------------------------------------------
Compilation par : L. Krishnananda, Professeur Assistant, Département d'ISE Page38de56
Laboratoire de microprocesseur (8086) Dept de CSE/ISE, Reva ITM, Bangalore

arrêter : MOV AH,4ch


INT 21h

FIN début

Titre 15a (ii) programme pour supprimer un fichier

.modèle petit

.pile

disp MACRO str ; définition de macro pour afficher une chaîne


LEA DX, str
MOV AH, 09h
INT 21h
FIN

.données
fichier DB 'd:\mpa_09\[Link]'
fichier supprimé avec succès.
msg2 DB 10, 13, ' !!!! fichier non trouvé !!!$'

.code

MOV AX, @données


DÉPLACE DS, AX

LEA DX, fichier ; Fonction DOS pour supprimer un fichier


MOV CX, 20h
MOU AH, 41h
INT 21h

JC échoue
afficher msg1
JMP suivant

échec : afficher msg2

suivant : MOV AH, 4CH


INT 21H
FIN
_____________________________________________
titre 15b) Contrôler une Interface d'Ascenseur
; Au départ, l'Ascenseur est au rez-de-chaussée, avec toutes les demandes en état OFF. Quand un
; une demande est faite, l'ascenseur se déplace à cet étage et y reste jusqu'à nouvel ordre
; demandes.

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page39de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

.modèle petit
.pile
.données
pa EQU 0d400h
pb EQU 0d401h
pc ÉQU 0d402h
cr ÉQU 0d403h
fcode DB 00h, 03h, 06h, 09h numéros d'étage
effacer DB 0e0h, 0d3h, 0b6h, 79h ; code pour effacer la LED de demande

.code
MOV AX, @données
MOV DS, AX
MOV DX, cr
MOV AL, 82H ; port A en sortie, port B en entrée
OUT DX, AL

XOR AX, AX
MOV AL, AH
OU AL, 0F0H
MOV DX, pa
OUT DX, AL
MOV DX, pb ; pointer au port B
retour2 : MOV CH, AH ; au départ AH = 0
; initialement, l'ascenseur au rez-de-chaussée
MOU AH, 01h
INT 16H
JNZ arrêter

MOV AH, CH
DANS AL, DX lire la demande de l'étage du port B
ET AL, 0FH
CMP AL, 0FH
JZ retour2

MOUV SI, 0
trouver: ROR AL, 1 trouver le numéro de l'étage
JNC trouvé
INC SI
JMP trouvezf
trouvé : MOV AL, fcode[SI] déplacez l'ascenseur vers
CMP AL, AH le sol demandé après
JA up ; comparaison de la demande avec la position actuelle de l'ascenseur
JB en bas

clair : MOV AL, fclear[SI] ; après avoir atteint le sol, effacez la demande
MOV DX, pa
SORTIE DX, AL
--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page40de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

JMP retour1
appel retard ; pour déplacer l'ascenseur vers le haut

INC AH
XCHG AL, AH
OU AL, 0F0H
MOV DX, pa
OUT DX, AL
ET AL, 0FH
XCHG AH, AL
CMP AL, AH
JNZ vers le haut

JMP clair
appel retard pour faire descendre l'ascenseur
DEC AH
ÉCHANGEMENT AL, AH

OU AL, 0F0H
MOV DX, pa
SORTIE DX, AL
ET AL, 0FH
XCHG AH, AL
CMP AL, AH
JNZ vers le bas

JMP clair
stop : MOV AH, 4CH
INT 21

retard PROC PROCIMITE ; procédure de retard

POUSSE CX
PUSH AX
MOV CX, 04fffh
back3 : MOV AX, 02fffh
DÉC AX
JNZ back4
BOUCLE arrière3
POP AX
POP CX
RET
retard ENDP

FIN

Questions d'exercice :
1. Modifiez le problème 15a pour afficher le répertoire de travail actuel
2. Modifiez le problème 15b pour déplacer l'ascenseur au rez-de-chaussée après que toutes les demandes aient été satisfaites.

--------------------------------------------------------------------
Rassemblé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page 41 sur 56
Laboratoire de microprocesseur (8086) Dépt de CSE/ISE, Reva ITM, Bangalore

12a) Lire l'heure actuelle du système et l'afficher dans un format standard sur
; l'écran.

.modèle petit

.pile

.données
msg1 DB 10,13, " @@@ Lecture du temps système :::$"

msg2 DB 10, 13, ' L'heure du système est >> $'

clrscr MACRO ; définition de macro pour effacer l'écran


MOV AL, 2
MOV AH, 0
INT 10H
FIN
dispm MACRO str
LEA DX, str
MOV AH, 9H
INT 21H
FIN
set_cursor MACRO ; définition de macro pour fixer la position du curseur à l'écran
DEPLACER BL, 0
MOUV AL, 3 ; utilisant la fonction BIOS
MOV DH, 15
MOV DL, 20
MOV AH, 2
INT 10H
FIN
.code

MOV AX, @données


MOV DS, AX
effacer l'écran

dispm msg1 ;invoquer des macros


définir_le_curseur
dispm msg2

MOV AH, 2Ch ; Fonction DOS pour lire l'heure système


INT 21h

DEPLACE AL, CH Heures enregistrées dans CH


AAM ; décompresser les chiffres
MOV BX, AX
APPELER affichage ; utilisez une procédure pour convertir en ASCII et afficher à l'écran
MOV DL,':' ; le format est hh:mm:ss
--------------------------------------------------------------------
Réalisé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page42de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

MOV AH, 02h


INT 21h

MOV AL, CL ; minutes dans le registre CL


AAM
MOUV BX, AX
APPELER afficher
MOUV DL, ':'
MOV AH, 02h
INT 21h

MOV AL, DH secondes dans le registre DH


AAM
DÉPLACE BX,AX
APPELER afficher
MOV AH,4ch
INT 21h

afficher PROC NEAR ;convertir en ASCII et afficher


MOV DL, BH
AJOUTER DL, 30h
MOU AH, 02h
INT 21h

MOV DL, BL
AJOUTER DL, 30h
MOV AH, 02h
INT 21h
RET
afficher ENDP
FIN
______________________________________________________-

titre 12b) Générer une onde sinusoïdale en utilisant l'interface DAC (la sortie du DAC est à
; être affiché sur un CRO).

.modèle petit
.données
porta EQU 0d400h
portb EQU 0d401h
portc EQU 0d402h
cwr EQU 0d403h

DB 00,11,22,33,43,53,63,72,81,89,97,104,109,115,119,122,125,126,127
; tableau pour stocker les valeurs de sinè

Observez l'onde sinusoidale sur le CRO ; Appuyez sur une touche pour quitter
.code
--------------------------------------------------------------------
Compile par : L. Krishnananda, Professeur Assistant, Département d'ISE Page 43 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

MOV AX, @données


MOV DS, AX

MOV DX, cwr ; rendre tous les ports en sortie


MOV AL, 80h seul le port A de 8255 est utilisé
SORTIE DX, AL

LEA DX, msg ; afficher un message à l'écran


MOV AH, 9H
INT 21H

MOV DX, porta ; DX a l'adresse du port A de 8255

onde complète
MOV SI, OFFSET sines ; utiliser SI comme pointeur vers le tableau

MOU CX, 13h nombre de valeurs dans le tableau


; l'ensemble de l'onde sinusoïdale (1 cycle) est divisé en 4 quadrants
premier_quart ; la valeur maximale est de 5V

MOV AL, 7FH


MOV BL, BYTE PTR [SI] ; prendre la valeur du sinus à partir du tableau
AJOUTER AL, BL
OUT DX, AL ; et l'envoyer au port (CRO)
INC SI
BOUCLE premier_quart
DÉPLACER CX, 12h
DEC SI

deuxième trimestre
MOV AL, 7FH
MOV BL, octet ptr [SI]
AJOUTER AL, BL
OUT DX, AL
DEC SI
BOUCLE deuxième_trimestre

MOV SI, décalage sines


MOV CX, 13h

troisième trimestre
MOV AL, 7fh
MOV BL, byte ptr [SI]
SOUSTRAIRE AL, BL

OUT DX, AL
INC SI
BOUCLE troisième_trimestre

DEC SI
MOV CX, 12h
--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur adjoint, département de l'ISE Page 44 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

quatrième trimestre
MOV AL, 7Fh
MOV BL, BYTE PTR [SI]
SUB AL, BL
OUT DX, AL
DÉC SI
BOUCLE quatrième_quart

MOV AH, 1 ; arrêtez si une touche est enfoncée


INT 16H
JNZ arrêt
JMP onde complète ; sinon, générez continuellement une onde sinusoidale

stop : MOV AH,4ch


INT 21h

FIN

Questions d'exercice :
1. Modifiez le problème 12a pour décompresser les chiffres sans utiliser l'instruction AAM.
2. Modifiez le problème 12a pour lire l'heure actuelle et mettre en œuvre une horloge en temps réel.
3. Modifiez le problème 12b pour générer des formes d'onde avec une valeur de crête de 2,5V et 4V.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

13a) Simuler un compteur décimal UP pour afficher 00-99

.modèle petit
.pile

.données
Le compteur décimal fonctionne##

clrscr MACRO
MOV AL, 2
MOV AH, 0
INT 10H
FIN

dispm MACRO str


LEA DX, str
MOV AH, 9H
INT 21H
FIN

.code
MOV AX, @données

--------------------------------------------------------------------
Rédigé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page45de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

MOV DS, AX
effacer l'écran ; invoquer la macro pour effacer l'écran
XOR AX, AX
afficher msg ; invoquer la macro pour afficher le message

appel de délai
MOUV AL, 30H ; AL contient le premier (plus grand) chiffre
à nouveau : MOV DL, AL ; afficher un chiffre supérieur
MOV AH, 02h
INT 21h

MOV SI, AX ; enregistrer la valeur d'AL

MOV BL, 30h ;BL contient le deuxième chiffre


RETOUR : MOV DL, BL
MOV AH, 2 afficher le deuxième chiffre (inférieur)
INT 21h
INC BL incrémenter le deuxième chiffre
Délai d'appel

MOV AH, 03h ; obtenir la position actuelle du curseur


INT 10h
MOV DL, 1 ; déplacer le curseur vers la colonne suivante

MOV AH, 2
INT 10h

CMP BL, 39h ; boucle interne


JLE de retour ; afficher tous les deuxièmes chiffres (0-9)

MOV DL, 0 ; définir la position du curseur à la colonne précédente


MOV AH, 2
INT 10h

MOV AX, SI
INC AL ;incrémenter le 1er chiffre
CMP AL, 39h
JLE encore ;boucle 1er chiffre (0-9)
; boucle externe pour un chiffre supérieur
DÉPLACE AH, 4Ch
INT 21h
délai PROC PRÈS ; procédure de retard
PUSH CX
POUSSE AX
MOV CX, 1000H
retour2: MOV AX, 04FFFh
RETOUR AX
JNZ retour1
BOUCLE arrière
POP AX
--------------------------------------------------------------------
Rassemblé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page46de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

POP CX
RET
retard ENDP

FIN
_____________________________________________________

titre 13b) Générer une forme d'onde sinusoïdale demi-redressée en utilisant l'interface DAC (le
La sortie du DAC doit être affichée sur un CRO.
.modèle
.données
00,22,44,66,87,108,127,146,164,180,195,209,221,231,240,246,251,254,255
msg DB 10,13, 10, 'Observez l'onde demi-redressée sur le CRO. Appuyez sur une touche pour sortir $'

porta EQU 0d400h


portb EQU 0d401h
portc EQU 0d402h
ctrl ÉQU 0d403h

.pile
.code
MOV AX, @données
DÉPLACER DS, AX
LEA DX, msg
MOV AH, 9
INT 21H
MOV AL, 80h ; rendre tous les ports en sortie
MOV DX, ctrl
OUT DX, AL
Délai d'appel

demi-onde
MOV DX, porta
MOV CX, 13h
MOV SI, OFFSET sines ; utiliser SI comme pointeur vers le tableau

Une onde moitié redressée aura une sortie à deux quadrants.


; et les deux quadrants suivants tension nulle
premier_quart
MOUV AL, BYTE PTR [SI]
OUT DX, AL
Délai d'appel
INC SI
BOUCLE premier_quart
DÉC SI
MOUV CX, 12H

deuxième trimestre
MOV AL, BYTE PTR [SI]
--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page47de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

SORTIE DX, AL
Délai d'appel
DEC SI
BOUCLE deuxième_quart

DÉPLACER CX, 25H


pas_de_vague
MOV AL, 00h
OUT DX, AL
Délai d'appel
BOUCLE sans_onde

DÉPLACER AH, 1 vérifiez si quelque chose est enfoncé. SI oui, arrêtez


INT 16H ; sinon recommencer
JNZ arrêt
JMP demi_onde

arrêter : MOV AH, 4CH


INT 21H

retard PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC PROC

POUSSE CX
MOV CX, 2FFFH
NOP
RETOUR EN ARRIÈRE

POP CX
RET
retard ENDP

FIN

Questions d'exercice :
1. Modifier le prob 13a pour générer un compteur décimal descendant.
2. Modifier le problème 13a pour générer un compteur HEX UP.
3. Modifiez le problème 13b pour générer des formes d'onde avec une valeur crête de 5V et 2,5V pendant no_wave.
durée.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

14a) Lire une paire de coordonnées d'entrée en BCD et déplacer le curseur vers la position spécifiée
; position sur l'écran.

.modèle petit

.pile

.données
--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page 48 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

xmsg DB 13,10,'ENTREZ LA VALUER DES COORDONNÉES X en BCD:$'

x DB ? ; pour stocker la valeur de la coordonnée X

ymsg DB 13,10,'ENTRER LA VALEUR DES COORDONNÉES Y en BCD:$'


y DB ? ; pour stocker la valeur de la coordonnée Y

le curseur est déplacé ici.$

clrscr MACRO
MOV AH, 0 ;macro POUR EFFACER L'ÉCRAN
MOV AL, 3
INT 10h
FIN
dispm MACRO str ; macro pour afficher une chaîne
MOV DX, OFFSET str
MOV AH,9H
INT 21H
FINM
.code

MOV AX, @data


MOUV DS, AX
POUR LIRE DES COORDONNÉES BCD
dispm xmsg
APPELER read_bcd ; en utilisant une procédure
MOV x, BH ; Valeur de la coordonnée X enregistrée
dispm ymsg
APPELER read_bcd
MOV y, BH ; Valeur de coordonnée Y stockée

effacer l'écran ; invoquer une macro pour effacer l'écran


; pour définir la position du curseur

MOV DH, x ; en utilisant la fonction BIOS


MOV DL, y
MOU BH, 0
MOU AH, 2H
INT 10H
dispm msg

MOV DL,'*' ; à la position du curseur, * est affiché


MOV AH, 02h
INT 21h

MOV AH, 1H ; appuyez sur une touche pour quitter

INT 21H
MOV AH, 4Ch
INT 21h
--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page49de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

lire_bcd PROC PROC procédure pour lire un nombre au clavier


; et convertir cet ASCII en BCD packagé
MOV AH, 01h ; lire le premier chiffre
INT 21h
MOV BH, AL

MOV AH, 01h ; lire LE DEUXIÈME CHIFFRE


INT 21h
MOV BL, AL
MOV AX, BX
SOUS AX, 3030H ; obtenir des nombres BCD décompressés
AAD obtenir des nombres BCD packagés
MOV BH, AL ; copier la valeur empaquetée dans BH
RET
lire_bcd ENDP

FIN
___________________________________________________________

titre 14b) Générer une forme d'onde sinusoïdale entièrement redressée en utilisant l'interface DAC
; (la sortie du DAC doit être affichée sur un CRO).

.modèle petit
.données
porta ÉQU 0d400h
portb EQU 0d401h
portc EQU 0d402h
cwr EQU 0d403h

sines DB 00,11,22,33,43,53,63,72,81,89,97,104,109,115,119,122,125,126,127
tableau pour stocker les valeurs de sin

Observer la forme d'onde sinusoïdale du redresseur complet sur l'oscilloscope ; Appuyez sur une touche pour sortir

.code
DEPLACE AX, @donnees
DÉPLACE DS, AX

MOV DX, cwr Rendre tous les ports en sortie


MOV AL, 80h seul le port A de 8255 est utilisé
SORTIE DX, AL

LEA DX, msg ; afficher un message à l'écran


MOV AH, 9H
INT 21H

MOV DX, porta ;accéder au port A en utilisant le registre DX

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur Assistant, Département de ISE Page 50 sur 56
Laboratoire de Microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

fullrec_wave
MOV SI, OFFSET sines
MOV CX, 13h
la pleine onde sinusoïdale redressée aura les deux premiers quadrants répétés en continu.
premier_quart
MOV AL, 7FH
MOV BL, octet PTR [si] ; prendre la valeur du sinus à partir du tableau
AJOUTER AL, BL
OUT DX, AL ; et l'envoyer au port (CRO)
INC SI
BOUCLE premier_quart
MOV CX, 12H
DEC SI

deuxième trimestre
MOV AL, 7FH
MOV BL, BYTE PTR [SI]
AJOUTER AL, BL
SORTIE DX, AL
DEC SI
BOUCLE deuxième_quart

DÉPLACE AH, 1 ; si une touche est enfoncée, arrêtez.


INT 16H
JNZ arrêter
Vague de retour complet JMP

stop : MOV AH,4CH


INT 21H
FIN

Questions d'exercice :
1. Modifier le prob 14a pour afficher votre nom à la position après avoir lu les points de coordonnées.
2. Modifiez le problème 14b pour générer des formes d'onde avec des tensions de sortie de 0 à 2,5 V et de 0 à 5 V

portée.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

titre 4A) Lisez un caractère alphanumérique et affichez son équivalent


; code ASCII (en HEX) au centre de l'écran.

.modèle petit
.pile

.données
DB 10, 'ENTREZ UNE TOUCHE DU CLAVIER', 10, 13, '$'
msg2 DB La valeur ASCII est : $

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur adjoint, Département d'ISE Page51de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

clrscr MACRO
MOV AL, 3 ;Mode vidéo = 3
MOU AH, 0 Pour effacer l'écran
INT 10H
FIN
dispm MACRO str
MOV DX, OFFSET str
MOV AH, 9H
INT 21H
FIN

.code
MOV AX, @data
DÉPLACE DS, AX ;Initialiser DS

effacer l'écran ; invoquer la macro


dispm msg1 ; invoquer la macro pour AFFICHER MSG

MOU AH, 1 Lisez un caractère du clavier avec écho


INT 21H

MOV BL, AL Stockez-le dans BL

;définir la position du curseur en utilisant la fonction BIOS

MOV BH, 0 ;page 0


MOV DH, 12 ;ligne=12 ligne centrale
MOV DL, 40 ;col=40 colonne centrale
MOV AH, 2
INT 10H
dispm msg2
MOV AL, BL décompresser les chiffres du caractère
ET AL, 0F0H sélectionnez le nible d'ordre supérieur
MOV CL, 4 Compteur de déplacements

SHR AL, CL Déplacer à droite de 4


APPELER DISP ;affichez-le
DÉPLACER AL, BL
ET AL, 0FH sélectionnez le nibble de faible ordre
APPELER disp ;affichez-le
MOV AH, 4CH ;sortie sécurisée vers dos
INT 21H

disp: CMP AL, 0AH convertir un caractère alphanumérique en


JB SKIP valeur ASCII équivalente
AJOUTER AL, 7
SAUTER : AJOUTER AL, 30H
MOV DL, AL
MOV AH, 02 ; appeler la fonction dos 02h pour imprimer un caractère

--------------------------------------------------------------------
Élaboré par : L. Krishnananda, professeur adjoint, département d'ISE Page52de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

INT 21H
RETOUR
FIN

Questions d'exercice :
1. Modifiez le problème 4a pour afficher la valeur ASCII à n'importe quelle position à l'écran
2. Modifier le problème 4b pour afficher les messages PASS et FAIL alternativement sur un afficheur à 7 segments

%%%%%%%%%%%%%%%%%%%%%%%%%%%%

titre 5A) Inverser une chaîne donnée et vérifier si c'est un palindrome ou non.

.modèle petit
.pile
.données
buf DB 60 ; tableau pour stocker la chaîne originale
DB ?
DB 60 DUP(?)
revbuf DB 60 DUP (?) ; tableau pour stocker la chaîne inversée

ENTRER LA CHAÎNE : $

DB 13,10,10, LA CHAÎNE ENTRÉE EST UN PALINDROME $


msg2 DB 13,10,10," LA CHAÎNE SAISIE N'EST PAS UN PALINDROME !!! $

dispm MACRO str ; définition de macro pour afficher un message


LEA DX, str
MOV AH, 9H
INT 21H
FIN
clrscr MACRO ; définition de macro pour effacer l'écran
MOV AL, 2
MOV AH, 0
INT 10H
FIN
.code
MOV AX, @données
MOV DS, AX
MOV ES, AX
clrscr
dispm msg ; invoquer macro

LEA DX, buf lire une chaîne à partir du clavier


MOV AH, 0AH
INT 21H

LEA SI, buf+1


LEA DI, revbuf
--------------------------------------------------------------------
Compilé par : L. Krishnananda, professeur adjoint, département de l'ISE Page53sur56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

MOV CH, 0
MOV CL, buf+1
AJOUTER SI, CX

retour : MOV AL, BYTE PTR [SI] ; inverser la chaîne et stocker dans la mémoire
MOV OCTET PTR [DI], AL
INC DI
DEC SI
RETOUR EN BOUCLE

CLD ; pointeurs à auto-incrément


LEA SI, buf+2 ; comparer les chaînes originales et inversées
LEA DI, revbuf ; utilisant l'instruction CMPSB
MOV CL, TAILLE buf+2 obtenir la taille de la chaîne dans le registre CL

répéter CMPSB
JNZ différent

dispm msg1 ; invoquer la macro pour afficher le message approprié


JMP arrêt
noteq : dispm msg2

arrêter : MOV AH, 4CH


INT 21H

FIN
Questions d'exercice :
1. Modifier le problème 5a pour afficher la chaîne d'origine ainsi que la chaîne inversée à l'écran.
2. Modifier le problème 5a pour vérifier si c'est un palindrome sans inverser la chaîne de caractères originale.
3. Modifiez le problème 5b pour faire défiler le message dans une seule direction pour un nombre spécifié de
fois.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

titre 6a) lire deux chaînes à partir du clavier et les stocker dans des emplacements.
vérifiez s'ils sont égaux ou non et affichez des messages appropriés.
; afficher également la longueur des chaînes
.modèle petit

.pile
.données
str1 DB 150 ; réserver de la mémoire pour stocker la chaîne 1
DB ? ; longueur de chaîne stockée ici
DB 150 dup(?)
str2 DB 150 réserver un tableau de mémoire pour stocker la chaîne 2
DB ?
DB 150 dup(?)

DB 10,10,13, ' Les chaînes sont égales. Messages

--------------------------------------------------------------------
Rassemblé par : L. Krishnananda, Professeur adjoint, Département de l'ISE Page54de56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

msg2 DB 10,10,13, ' Chaînes pas égales !!!!! $'


msg3 DB 10,13, ' Entrez la chaîne1 (jusqu'à 9 caractères) : $'
msg4 DB 10,13, ' Entrez string2 (jusqu'à 9 caractères) : $'
msg5 DB 10,13, ' Longueur de string1 = $'
msg6 DB 10,13, ' Longueur de string2 = $'

clrscr MACRO ; définition de macro pour effacer l'écran


MOUV AL, 2
MOV AH,0
INT 10H
FIN

dispm MACRO str ; définition de macro pour afficher une chaîne à l'écran
LEA DX, str
MOV AH, 09h
INT 21h
FIN

.code
MOUV AX,@données
MOV DS, AX
MOV ES, AX ; Segment supplémentaire requis pour l'instruction CMPSB
effacer l'écran
dispm msg3 ; invoquer la macro pour afficher le message

MOV DX, OFFSET str1 ; lire string1 depuis le clavier


MOV AH,0ah ; utilisant l'interruption DOS
INT 21h

dispm msg4

MOV DX, OFFSET str2 lire string2 au clavier


MOV AH, 0AH
INT 21h
Pour afficher la longueur de string1
afficher msg5 ; invoquer la macro
MOV DL, str1[1]
AJOUTER DL, 30H
MOU AH, 2
INT 21H
dispm msg6 Pour afficher la longueur de string2
MOV DL, str2[1]
AJOUTER DL, 30H
MOV AH, 2
INT 21H

MOV AL, str1[1] Comparer les longueurs de chaînes


CMP AL, str2[1]
--------------------------------------------------------------------
Rassemblé par : L. Krishnananda, Professeur assistant, Département de l'ISE Page 55 sur 56
Laboratoire de microprocesseur (8086) Département de CSE/ISE, Reva ITM, Bangalore

JNE noteq Si les longueurs ne sont pas égales, afficher 'pas égal'

MOV CH, 00h ; Si les longueurs de chaîne sont égales, alors comparer deux chaînes
MOV CL, str1[1] ; obtenir la taille de la chaîne 2 dans le registre CL

CLD
LIRE SI, str1+2
LEA DI, str2+2
répéter CMPSB Comparez les chaînes en utilisant l'instruction CMPSB
JNZ noteq Si ils ne sont pas égaux afficher 'pas égaux'

dispm msg1 Si les chaînes sont égales, afficher 'Égal'

JMP arrêter
noteq : dispm msg2 Affichage Non Égal

arrêter : MOV AH,4CH


INT 21h

FIN

Questions d'exercice :
1. Modifiez le problème 6a pour vérifier l'égalité des chaînes sans utiliser l'instruction CMPSB.
2. Modifiez le problème 6a pour accepter des chaînes de plus de 9 caractères et afficher leur longueur.
de manière appropriée en Hex ou décimal.

--------------------------------------------------------------------
Compilé par : L. Krishnananda, Professeur Assistant, Département d'ISE Page 56 de 56

Vous aimerez peut-être aussi