Assembleur IUT LENS 2002 Les instructions logiques L`opérande

publicité
Assembleur
IUT LENS 2002
L’opérande XOR
l
XOR Destination, Source
l
Cette instruction ré alise un OU Exclusif entre la
source et la destination. On l’utilise très souvent pour
effacer un registre (Xor sur lui-mê me)
Les instructions logiques
MOV AH,00111100
XOR AH,11001100
=> AH = 11110000
Assembleur - IUT LENS 2002
Les instructions logiques
l
l
Les instructions logiques sont é quivalentes
aux portes de base utilisé es dans les circuits
logiques.
Assembleur - IUT LENS 2002
L’opérande NOT
l
NOT source
l
Cette opé ration effectue un NON logique sur
source.
L’assembleur possède donc les instructions
é lé mentaires à partir desquelles on peut
obtenir l’ensemble des cas possibles.
Mov AH,11001101
NOT AH
=> AH 00110010
Assembleur - IUT LENS 2002
Assembleur - IUT LENS 2002
L’opérande AND
Assembleur
IUT LENS 2002
l
AND destination, source
l
Cette opé ration effectue un ET logique entre
destination et source.
Structures Conditionnelles
et de Boucles
Mov AH,11001101
Mov AL,00111100
AND AH,AL
=> AH 00001100
Assembleur - IUT LENS 2002
L’opérande OR
Assembleur - IUT LENS 2002
Le fonctionnement.
l
OR destination, source
l
Cette opé ration effectue un OU logique entre
destination et source.
l
l
Le rô le d’une structure conditionnelle est d’orienté le
programme en fonction du ré sultat d’un test dans les
langages de haut niveau ou d’une opé ration
arithmé tique en assembleur.
La plus connue é tant le
SI
…
ALORS
…
SINON
Mov AH,11001101
Mov AL,00111100
OR AH,AL
=> AH 11111101
Assembleur - IUT LENS 2002
Assembleur - IUT LENS 2002
En Assembleur ?
l
l
Les Labels
Il n’existe aucune structure conditionnelle de
ce type mais on peut contourner ce
problème.
l
Il est possible en assembleur de nommer
des lignes de codes.
–
–
L’instruction SI ALORS SINON des langages
de haut niveau se transforme en plusieurs
instructions assembleur.
Soit par un dé placement relatif dans le code, mais
qui risque de changer à chaque compilation
Soit par un label pré cé dant la ligne de code, à la
charge du compilateur de transformer ce label en
dé placement
VotreNom : Instruction Asm
Assembleur - IUT LENS 2002
Algorithme général
l
Assembleur - IUT LENS 2002
L’instruction CMP
On peut ré sumer la transformation du SI
ALORS SINON sous cette forme
d’instructions é lé mentaires.
SI => Opé ration de Test ou Arithmé tique.
ALORS => Test d’un indicateur et Saut à une autre endroit
SINON => Suite du programme
l
CMP destination, source
l
Cette opé ration effectue l’opé ration SUB
mais n’affecte pas le ré sultat dans
destination.
Elle sert à comparer les deux opé randes.
l
Assembleur - IUT LENS 2002
Ce qui donne en ASM …
MOV AL,0FFH
CMP AL,0
JA Label1
… … … ..… … .
… … … … … ...
Label1 : … … ..
… … … … … .
AL = OFFH;
Assembleur - IUT LENS 2002
L’instruction TEST
l
TEST destination, source
l
L’instruction TEST effectue la mê me
opé ration que le ET logique, sauf qu’aucun
ré sultat n’est stocké dans destination.
l
On se sert de cette instruction pour
dé terminer la position d’un ou plusieurs bits.
SI AL > 0
ALLER A Label1
… … ..
… … ..
Label1 :… … … …
… … … … … … … .
Assembleur - IUT LENS 2002
Les instructions de Test
l
Toutes les instructions positionnant les Flags
peuvent servir de Test.
l
Il existe cependant 2 instructions spé cifiques
de test qui ont l’avantage, par rapport aux
instructions arithmé tiques, de ne pas
modifier les opé randes.
Assembleur - IUT LENS 2002
Assembleur - IUT LENS 2002
Les instructions de Saut
l
Ils existent deux instructions de saut : l’une
conditionnelle Jcond et l’autre inconditionnelle JMP.
l
Dans le cadre des structures conditionnelles, on
utilise Jcond où cond repré sente une des conditions
suivantes.
Jcond Label
Assembleur - IUT LENS 2002
Les conditions non signées
Condition
Description
Quelques exemples (1)
Flag testé
A / NBE
Supé rieur / Pas infé rieur ni é gal
CF ou ZF = 0
AE / NB
Supé rieur ou é gal / Pas infé rieur
CF = 0
B / NAE
Infé rieur / Pas supé rieur ni é gal
CF ou ZF = 1
BE / NA
Infé rieur ou é gal / Pas supé rieur
CF ou ZF = 1
C
Carry é gal à 1
CF = 1
NC
Carry é gal à 0
CF = 0
Parité / Parité paire
PF = 1
Pas de parité / parité Impaire
PF = 0
P / PE
NP / PO
Label1:
Label2:
JMP Label2
While (a < 5) {
INC B
B++;
INC A
A++;
CMP A,5
JL Label1
}
Assembleur - IUT LENS 2002
Conditions Signées
Condition
Description
Assembleur - IUT LENS 2002
Quelques Exemples (2)
Flag testé
G / NLE
Supé rieur / Pas infé rieur ni é gal
((SF xor OF) ou ZF) = 0
GE / NL
Supé rieur ou é gal / Pas infé rieur
(SF xor OF) = 0
L / NGE
Infé rieur / Pas supé rieur ni é gal
(SF xor OF) = 1
LE / NG
Infé rieur ou é gal / Pas supé rieur
((SF xor OF) ou ZF) = 1
O
Overflow é gal à 1
OF = 1
NO
Overflow é gal à 0
OF = 0
S
Signe positif
SF = 1
NS
Signe né gatif
SF = 0
Do {
Label1:
DEC B
B--;
INC C
C++;
CMP B,0
}
JL Label1
While (B!=0);
Assembleur - IUT LENS 2002
Condition sur Zéro
Assembleur - IUT LENS 2002
Quelques exemples (3)
Label1:
Condition
E/Z
NE / NZ
Description
Flag testé
Egal / Zé ro
ZF = 1
Pas é gal / Pas Zé ro
ZF = 0
MOV C,0
For (c=0;c<10;c++)
CMP C,10
{;
JG Label2
A = A +B;
ADD A, B
INC C
JMP Label1
}
Label2
Assembleur - IUT LENS 2002
L’instruction JMP
l
Assembleur - IUT LENS 2002
L’instruction LOOP
JMP Label
Cette instruction effectue un saut
inconditionnel vers Label.
attention comme dans tout programme si vous
cré er une boucle vé rifiez bien que le code
permette d’en sortir.
l
Assembleur - IUT LENS 2002
l
L’instruction loop permet de gé rer des boucles for,
en utilisant le registre de « boucle » CX.
l
A chaque tour de boucle CX est dé cré menté .
l
Dès que le registre arrive à 0 l’instruction suivante
est exé cuté e, sinon on remonte au label de dé but de
boucle.
Assembleur - IUT LENS 2002
Exemple d’utilisation de Loop
Notion de segment
Start :
For :
MOV CX,10
… … … … … .
LOOP For
l
Un segment est un bloc de mé moire
continue (que l’on peut parcourir liné airement
du dé but à la fin)
Equivaut à
For (i=10;i>0.i--) { …
l
Des segments peuvent se chevaucher.
l
Il peut y en avoir autant que né cessaire.
l
}
Assembleur - IUT LENS 2002
Assembleur
IUT LENS 2002
Assembleur - IUT LENS 2002
L’OFFSET d’une adresse
l
Il repré sente un dé placement par rapport à la
base du segment associé .
l
L’offset et le segment composent l’adresse
logique (ou segmenté e) d’une variable.
La Mé moire
Assembleur - IUT LENS 2002
La mémoire et les variables
l
La mé moire et les diffé rents modes d’accès
vont nous permettre d’aller plus loin dans
l’utilisation de l’assembleur.
l
Les registres é tant limité s en nombre et à
des longueurs de 16 bits maximum, la
mé moire permet de stocker des informations
sur des tailles plus importantes.
Assembleur - IUT LENS 2002
L’adresse physique
l
Pour obtenir l’adresse physique à partir de
l’offset et d’un segment, il suffit d’appliquer
la formule suivante.
ADRESSE PHYSIQUE = SEGMENTS *16 + OFFSET
l
On obtient alors une adresse sur 20 bits
permettant d’adresser jusqu’à 1 Mo pour le
mode ré el.
Assembleur - IUT LENS 2002
La mémoire est « quasi-illimitée »
l
l
Comment y accé der ? Si on utilise l’ancien
système (ie un registre 16 bits pour
repré senter une adresse mé moire on arrive à
une limite de 64Ko).
Les 80X86 ont donc une mé thode plus
compliqué e qui remonte à l’é poque où des
registres supé rieurs à 16 bits é taient
« irré alisables ».
Assembleur - IUT LENS 2002
Assembleur - IUT LENS 2002
Le mode protégé
l
La mé moire actuelle dé passant allé grement le Mo
maintenant il faut pouvoir y accé der é galement.
l
Pour cette raison un deuxième mode de
repré sentation des adresses mé moire est apparu à
partir du 286.
l
Nous y reviendrons lorsque nous é tudierons les
é volutions de l’assembleur.
Assembleur - IUT LENS 2002
Comment nommer une variable
l
Le nommage des variables obé it à certaines
règles. Son nom doit en effet :
–
–
l
Quelques exemples de déclarations
l
Nombre1 DD 12345678
Caractère DB ‘a’
Nombre2 DW 1234H
Inconnu DD ?
Inconnu2 DB 5 DUP (0)
Contenir des lettres, des chiffres ou des
caractères spé ciaux ? @ _ (La casse n’a pas
d’importance).
Commencer par une lettre ou un caractère
spé cial.
La longueur maximale est de 255 caract ères
mais seul les 31 premiers sont significatifs.
Exemples de dé clarations dans la section .DATA
l
La famille des processeurs 80X86 utilise la repré sentation
« LITTLE ENDIAN » c’est-à-dire que l’on commence par le
poids faible des donné es.
Assembleur - IUT LENS 2002
Les types de variables
Assembleur - IUT LENS 2002
Représentation Mémoire
l
Dans les langages de haut niveau, il est possible de
« typer » une variable. En assembleur, il s’agit plutô t
d’indiquer la taille de cette dernière qui pourra
contenir n’importe quelle information.
l
Attention, l’absence de typage implique que vous
interpré tiez
correctement
votre
variable,
le
compilateur ne vous sera d’aucune aide la-dessus.
l
Pour les exemples pré cé dents on obtient alors la
repré sentation mé moire suivante. Chacune des
cases repré sente un octet (8 bits)
Adr ?
N+8
?
?
0
0
0
Adr
N
56
34
12
‘a’
34H 12H ?
78
Assembleur - IUT LENS 2002
Les différentes tailles de variables
DB
DW
Octet
Word
8 bits
16 bits
DD
DP
DQ
DT
Double Word
Pword
Quad Word
10 bytes
32 bits
48 bits
64 bits
80 bits
0
0
Assembleur - IUT LENS 2002
L’instruction DUP
l
L’instruction DUP est très pratique pour initialiser un
tableau.
l
Soit a une valeur initiale comme dans l’exemple :
Variable Type NbCase DUP (Valeur)
l
Soit pour ré server une zone mé moire qu’on affectera
plus tard.
Variable Type NbCase DUP (?)
Assembleur - IUT LENS 2002
L’initialisation des variables
l
Assembleur - IUT LENS 2002
Assembleur
IUT LENS 2002
Pour initialiser vos variables on distingue 4
repré sentations « entière »+ 2 flottantes
–
–
–
–
Nombre dé cimal : Suite de chiffres suivie ou non
de D
Nombre Hexadé cimal : Suite de Chiffres ou de
A..F et suivie de H
ASCII : Suite de caractères encadré e par des
apostrophes « ‘»
Inconnue : Suite de points d’interrogation
Assembleur - IUT LENS 2002
Les diffé rents modes
d’adressages
Assembleur - IUT LENS 2002
Comment accéder aux variables
l
l
On sait dé finir des variables mais comment y
accé der lorsqu’elles ne correspondent pas
aux registres ?
Ce
sont
les
diffé rentes
solutions
d’adressages qui vont vous permettre de
travailler sur vos variables.
L’adressage direct
l
Cet adressage travaille directement sur la mé moire,
soit en lecture soit en é criture.
l
Exemple :
Mov [input],ax
Mov AX,[input]
l
Aucun contrô le n’est effectué c’est-à-dire que si AX
dé passe la capacité d’INPUT vous é craserez la zone
suivante, avec les risques que cela comporte.
Assembleur - IUT LENS 2002
Obtenir son adresse mémoire
l
l
Vous avez dé jà vu lors du cours pré cé dent
l’instruction OFFSET qui vous permet de
ré cupé rer l’OFFSET d’une variable mé moire.
Cet OFFSET associé au segment de
donné es correspondant vous donnera une
adresse physique.
Mov AX,OFFSET Var1
Assembleur - IUT LENS 2002
L’adressage indirect de registre
l
Cette mé thode est une fusion de l’adressage de
registre et de l’adressage direct.
l
Exemple :
Mov BX,OFFSET INPUT
Mov AX,[BX]
l
Dans cet exemple, on affecte à AX le contenu de la
mé moire pointé e indirectement par BX.
Assembleur - IUT LENS 2002
L’adressage de registre
L’adressage indexé direct
l
C’est l’adressage que vous avez utilisé jusqu’ici : Il
ne fait intervenir que des registres.
l
Exemple :
Mov BX,CX
l
Assembleur - IUT LENS 2002
l
On utilise un registre d’index SI ou DI pour
incré menter l’offset.
l
Exemple :
Mov AL,[INPUT + DI]
Mov [INPUT + DI],AL
Remarque :
Les registres doivent ê tre de mê me taille.
Assembleur - IUT LENS 2002
L’adressage Immédiat
Assembleur - IUT LENS 2002
L’adressage indexé de base
l
Là encore, c’est un des modes que vous avez dé jà
utilisé : il fait intervenir un registre en é criture et une
valeur.
l
Exemple :
l
Avec cette mé thode d’adressage, on utilise en plus un registre
de base en gé né ral BP.
l
Exemple :
Mov AL,[INPUT +BP +DI]
Mov [INPUT +BP +DI],AL
MOV AX,12
MOV AX,6000
l
Remarque :
– La valeur doit ê tre d’une taille é quivalente ou
infé rieure au registre utilisé .
– Mov 12,AX est bien entendu impossible … ..
Assembleur - IUT LENS 2002
l
ATTENTION : En Utilisant BP comme registre de base le
segment par dé faut est SS et non plus DS. Pour vous
repositionner sur DS il faut alors utiliser la syntaxe suivante :
Mov AX,DS:[INPUT + BP + DI]
Assembleur - IUT LENS 2002
L’adressage de base
l
l
L’instruction PUSH
Similaire à l’adressage indirect de registre
auquel on rajoute un constante de
dé placement.
l
l
SP est dé cré menté de 2 pour une valeur de 16 bits
ou de 4 pour une valeur de 32 bits à chaque fois que
l’on empile une valeur.
l
La pile n’accepte que les valeurs sur 16 bits ou 32
bits.
Exemple :
Mov AX,[BX+2]
Mov [BX+2],AX
PUSH source
L’instruction PUSH dé pose sur la pile la valeur de
source.
Assembleur - IUT LENS 2002
Assembleur
IUT LENS 2002
La pile et ses fonctions
Assembleur - IUT LENS 2002
Deux variantes utiles du PUSH
l
PUSHF : Cette instruction sans paramètre
permet de sauvegarder le registre des
indicateurs.
l
PUSHA : Cette instruction, é galement sans
paramètre, sauvegarde l’ensemble des
registres gé né raux ie : AX, CX, DX, BX, SP,
SP, SI, DI
Assembleur - IUT LENS 2002
A quoi sert la pile ?
l
Assembleur - IUT LENS 2002
L’instruction POP
La pile a plusieurs fonctions :
–
–
Elle vous permet de « sauvegarder » les valeurs
de registres sans forcé ment recourir à des
variables mé moires.
Elle sert de sauvegarde du contexte lors de
l’appel à des sous programmes ou interruption.
l
POP destination
L’instruction POP retire de la pile la valeur du
sommet et la stocke dans destination.
l
SP est incré menté de 2 pour une valeur de 16 bits
ou de 4 pour une valeur de 32 bits à chaque fois que
l’on dé pile une valeur.
l
Destination doit ê tre de taille 16 bits ou 32 bits.
Assembleur - IUT LENS 2002
Comment fonctionne une pile ?
l
Deux instructions POP et PUSH
(respectivement Dé piler / empiler)
l
La taille de la pile est dé finie par la directive
STACK
l
Elle fonctionne suivant le principe LIFO (Last
in First Out)
Assembleur - IUT LENS 2002
Assembleur - IUT LENS 2002
Les variantes de POP
l
POPF : Restaure le registre des indicateurs
qui aura é té pré alablement sauvegardé par
PUSHF.
l
POPA : Restaure l’ensemble des registres
gé né raux qui aura é té
pré alablement
sauvegardé par PUSHA.
Assembleur - IUT LENS 2002
Rappel sur les piles (1)
l
Il faudra toujours veiller àdé piler l’ensemble des
valeurs dans le sens inverse de celui que vous avez
utilisé pour les empiler.
Push AX
Push BX
… … … ..
Pop BX
Pop AX
Assembleur - IUT LENS 2002
Rappel sur les piles (2)
l
Il ne faudra jamais laisser ou oublier des valeurs sur la
pile (en particulier dans les sous programmes ou
procé dure).
l
N’oubliez pas non plus que certaines instructions
assembleur vont é galement se servir de la pile pour
sauvegarder le contexte.
l
Et toujours se rappeler qu’il n’y a aucun contrô le
d’effectuer sur la cohé rence de votre code… . Toute
erreur est donc susceptible de provoquer un beau
plantage.
Assembleur - IUT LENS 2002
Téléchargement