Vous êtes sur la page 1sur 3

Université Hassan II Casablanca A.

U : 11/12
FST Mohammédia LST EI
Dépt. Génie électrique
Module « Informatique Industrielle »
Contrôle (Durée 2h, sans documents)

Exercice 1
Ecrire un programme invmess.asm qui copie l'inverse d'une chaîne de caractères
(message) dans une autre chaîne (inverse). La variable message est initialisée lors de
sa déclaration (avec un $ définissant la fin de la chaîne), la variable inverse est initialisée
à 0. L'inversion doit être réalisée en utilisant la pile.

Exercice 2
On se propose de réaliser un programme en assembleur 80x86 avec toutes les
initialisations utiles. Ce programme fait la somme des N premiers entiers naturels ne
dépassant pas une valeur MAXI positive fixée par avance dans une variable. N est inconnu
au départ. Le but du programme est de trouver le nombre N d’entiers.

Exemple : Si MAXI = 12 alors SOMME = 1+2+3+4 = 10


N=4

Les variables utilisées dans ce programme seront déclarées comme suit :


N DB ?
SOMME DW ?
MAXI DW 100

Exercice 3
Vous avez codé le programme suivant en assembleur 8086 :

ORG 6C6Ch
MOV AX,1
MaVar DB ‘Allo’
LEA BX, MaVar
MOV AX, [BX+2]
TourneEnRond:
JMP TourneEnRond

Quelle est la valeur, en hexadécimal, de AX si on exécute le programme à partir de 6C6Ch


pendant un temps infini?

Si on réécrivait le programme en déplaçant la ligne « MaVar DB ‘Allo’» juste après


l’instruction « JMP TourneEnRond » cela changerait-il la valeur de AX? Si oui, donnez la
nouvelle valeur. Si non, expliquez.

Vous retrouverez en annexe B des données qui vous aideront à répondre à la question.
Annexe A : Liste non exhaustive des instructions du 8086
Instruction Description
ADD a,b Effectue a = a+b.
AND a,b Effectue a = a ET b, où ET est un ET logique.
CALL proc Appelle la procédure proc et empile l’emplacement de retour.
CLC Met à 0 le drapeau de retenue (carry).
CMP a,b Effectue a-b, a et b sont inchangés.
DEC a Décrémente a.
DIV mot Effectue AX = DXAX/mot, non signé, le résultat est tronqué (arrondi
inférieur).
IDIV mot Effectue AX = DXAX/mot, signé, le résultat est tronqué (arrondi
inférieur).
IMUL mot Effectue DXAX = AX*mot, signé.
IN dst, port Met la valeur lue sur le port de I/O port dans dst.
INC a Incrémente a.
INT a Appelle la routine de service d’interruption a. Empile les drapeaux et
l’emplacement de retour.
IRET Retourne d’une int. en dépilant l’emplacement de retour et les drapeaux.
JC label Saute à l’instruction désignée par label si le drapeau Carry est 1.
JMP label Saute à label. La prochaine instruction exécutée est désignée par label.
JNC label Saute à l’instruction désignée par label si le drapeau Carry est 0.
JNZ label Saute à l’instruction désignée par label si le drapeau Zéro est 0.
JNS label Saute à l’instruction désignée par label si le drapeau Signe est 0.
JZ label Saute à l’instruction désignée par label si le drapeau Zéro est 1.
JS label Saute à l’instruction désignée par label si le drapeau Signe est 1.
LEA dst,var Met l’adresse de la variable var dans dst.
MOV dst,src Met le contenu de src dans dst. Ne change pas les drapeaux.
MUL byte Effectue AX = AL*byte, non signé.
NEG a Inverse tous les bits de a, puis ajoute 1.
NOT a Inverse tous les bits de a.
OR a,b Effectue a = a OU b, où OU est un OU logique.
OUT port, src Met la valeur de src sur le port de I/O port.
POP mot Dépile un mot. Ne change pas les drapeaux.
POPF Dépile les drapeaux.
PUSH mot Empile un mot. Ne change pas les drapeaux.
PUSHF Empile les drapeaux.
RET et RETF Retourne d’une procédure en dépilant l’emplacement de retour. RET
dépile IP. RETF dépile IP puis CS.
RCL a,b Fait une rotation de b bits vers la gauche. La rotation inclut le bit de
Carry.
RCR a,b Fait une rotation de b bits vers la droite. La rotation inclut le bit de
Carry.
SAL a,b Décale tous les bits de a vers la gauche d’un nombre de bits égal à b. Des
zéros sont mis à droite.
SAR a,b Décale tous les bits de a vers la droite d’un nombre de bits égal à b. Le bit
le plus significatif de a est mis à gauche.
STI Met à 1 le drapeau des interruptions.
SUB a,b Effectue a = a-b.
TEST a,b Effectue a ET b, où ET est un ET logique.
XOR a,b Effectue a = a XOR b, où XOR est un OU eXclusif.
Annexe B : Table ASCII et codes op (opcodes) du 8086
Sous-ensemble de la table ASCII
Dec Hex Chr
65d 41h A
66d 42h B
… … …
76d 4Ch L
… … …
90d 5Ah Z
… … …
97d 61h a
98d 62h b
… … …
108d 6Ch l
… … …
122d 7Ah z

Opcodes et paramètres fictifs d'instructions 8086


Instruction Taille Opcode Paramètres
ADD Reg/Reg 3 bytes 21h Deux bytes pour décrire les deux registres qu'il faut additonner
ADDA Reg 2 bytes 22h Un byte pour décrire le registre qu'il faut additonner à AX
JMP Reg 2 bytes 40h Un byte pour décrire le registre désignant la prochaine instruction (IP)
JMP dest 3 bytes 41h Deux bytes pour décrire le IP de la prochaine instruction
MOV Reg/Reg 3 bytes 80h Deux bytes pour décrire le registre source et le registre destination
MOV Reg/Mem 4 bytes 81h Un byte pour décrire le registre et deux byte pour décrire l'adresse
MOV Mem/Reg 4 bytes 83h Un byte pour décrire le registre et deux byte pour décrire l'adresse
POP Reg 2 bytes A0h Un byte pour décrire le registre qu'il faut dépiler
POP Mem 3 bytes A2h Deux byte pour décrire l'adresse qu'il faut dépiler
PUSH Reg 2 bytes A1h Un byte pour décrire le registre qu'il faut empiler
PUSH Mem 3 bytes A3h Deux byte pour décrire l'adresse qu'il faut empiler

Note: Les données contenues dans cette table sont fictives

Vous aimerez peut-être aussi