Assembleur 8086 - Ecole Nationale d`Ingénieurs de Monastir

publicité
Microprocesseurs & Microcontrôleurs
Lotfi BOUSSAID
Département de Génie Électrique
Ecole Nationale d’Ingénieurs de Monastir
[email protected]
2016 - 2017
Assembleur 8086
Mode d’adressage
 Mode d’adressage
•
Les instructions peuvent avoir 0, 1, ou 2 opérandes.
Exemples :
Instructions sans opérande: NOP, STI, CLI, PUSHF, CBW...;
Instructions avec une seule opérande: INC, DEC, NEG, NOT ....;
Instructions avec deux opérandes: CMP, ADD, MOV, LEA, XCHG, AND ......
- Une opérande peut se trouver dans un registre du 8086, dans un octet, dans un
mot 16 bits ou dans un double mot 32 bits
- Les opérations peuvent avoir lieu:
o Entre un registre et un autre registre,
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
2
Assembleur 8086
Mode d’adressage

Entre un registre et un octet ou un mot en mémoire mais pas entre 2 octets ou 2
mots en mémoire (il faut passer dans ce cas par un registre). Toutefois les
instructions de mouvement de chaînes d'octets effectuent "directement" le transfert
de mémoire à mémoire (octet par octet ou mot par mot), l'adressage se faisant par
les registres DS:SI et ES:DI.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
3
Assembleur 8086
Mode d’adressage
Les instructions de transfert
Adressage registre à registre :
Exemple:
MOV AX, BX
ADD CH, DL
Adressage immédiat :
Exemples:
MOV AX, 0A1EBH
ADD CL, 25
OR AH,11000000
; opérandes 16 bit
; opérandes 8 bits
; AX:= valeur hexa A1EB
; CL:= CL + 25
; forcer les 2 bits de fort poids de AH à 1
 Adressage direct :
Exemples:
MOV BX,Total
MOV DX,ES:Nom
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
4
Assembleur 8086
Mode d’adressage
Les instructions de transfert
Adressage indirect (ou basé) :
Exemples:
MOV AX,[BX]
MOV AX,[BP]
Adressage indexé :
Exemple:
MOV AX,Tab[SI]
 Adressage indirect indexé (ou basé indexé) :
Exemples:
MOV AX,[BX][SI] ; relatif a DS
MOV AX,[BP][SI] ;Relatif a SS
Adressage basé indexé avec déplacement.
Exemple:
MOV AX,Compte[BX][SI]
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
5
Assembleur 8086
Les Principales Instructions de l’assembleur
 L’instruction LEA
Exemples:
LEA BX,Tableau ;chargement de l’adresse de Tableau
LEA BX,Tableau[SI]
L'instruction XCHG :
Exemple:
XCHG AX,Somme ;échange des contenus de AX et de Somme
Les instructions PUSH et POP
Exemple:
PUSH SI
Lotfi BOUSSAID
;empile le contenu de SI
Microprocesseurs & Microcontrôleurs
6
Assembleur 8086
Les Principales Instructions de l’assembleur
Les instructions arithmétiques
Les instructions d'addition ADD et ADC.
Exemples:
ADD AX,BX
ADD AX,0F00H
ADC DX,0
;AX reçoit AX + BX
;ces 2 instructions additionnent la
;valeur immédiate 0F00H à la paire de
;registres DX:AX (32 bits) avec addition de la retenue Cy.
Les instructions de soustraction SUB et SBB :
SUB AX,DX
SBB SI,100
;AX reçoit AX-DX
;SI reçoit SI-100 - Carry
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
7
Assembleur 8086
Les Principales Instructions de l’assembleur
 Les instructions de multiplication: MUL et IMUL
Exemples:
MUL CL
; AX:=AL * CL résultat sur 16 bits
IMUL CX
; DX:AX:= AX * CX résultat sur 32 bits non signe
 Les instructions de division: DIV et IDIV
Exemples:
IDIV BX ;DX:AX est divisé par BX, le reste est dans DX et le quotient dans AX
DIV BL ;AX est divisé par BL, le reste est dans AH, le quotient dans AL.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
8
Assembleur 8086
Les Principales Instructions de l’assembleur
Les instructions de décalage et de rotation
 Les instructions de décalage gauche :SHL Opérande,Nombre
Opérande: Opérande = registre / case mémoire
Nombre: Nombre = soit la valeur 1, soit la valeur contenue dans CL
 Les instructions de décalage droite :SHR Opérande,Nombre
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
9
Assembleur 8086
Les Principales Instructions de l’assembleur
 Les instructions de rotation gauche : ROL Opérande , Nombre
 Les instructions de rotation gauche :ROR Opérande , Nombre
 Les instructions de rotation gauche avec retenu :RCL Opérande , Nombre
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
10
Assembleur 8086
Les Principales Instructions de l’assembleur
 Les instructions de rotation droite avec retenu :RCR Opérande,Nombre
 Les instructions logiques AND, OR et XOR
Syntaxe:
AND Destination , Source
OR Destination , Source
XOR Destination , Source
Destination = registre / case mémoire
Source = registre / valeur immédiate / case mémoire à condition que Destination ne soit pas
une case mémoire.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
11
Assembleur 8086
Les Principales Instructions de l’assembleur
 Les instructions logiques AND, OR et XOR
Exemples:
•
•
•
AND AX, FFF0H
OR AL, 1
AND AX, Masque
•
•
XOR AX,-1
TEST BX, FFFE
0011
OR 0 1 0 1
0111
AND
;met à 0 les 4 bits de faible poids de AX
;met à 1 le bit de faible poids de AL
;fait un ET logique entre le contenu de AX
;et celui de Masque, le résultat est dans AX
;fait le complément à 1 de AX
; fait un ET logique entre le contenu de BX
;et 0FFFE sans modifier BX. Permet de
;tester le bit 1 de BX
0011
0101
XOR
0001
Lotfi BOUSSAID
0011
0101
0110
Microprocesseurs & Microcontrôleurs
12
Assembleur 8086
Les Principales Instructions de l’assembleur
Les instructions de comparaison
Syntaxe:
CMP Destination , Source
TEST Destination , Source
Destination = registre / case mémoire
Source = registre / case mémoire / valeur
Exemples:
•
•
•
CMP AL,CL
CMP AL,0
TEST AL,AH
; compare AL à CL
; compare AL à 0
; ET logique entre AL et AH
Remarque: TEST laisse les opérandes du ET logique inchangées; les indicateurs sont positionnés en
fonction du résultat du ET logique.
Lotfi BOUSSAID
Microprocesseurs
Microprocesseurs & Microcontrôleurs
13
13
Assembleur 8086
Les Principales Instructions de l’assembleur
Les instructions de saut.
Saut inconditionnel:
Exemple:
JMP Cas1
JMP [BX]
;saut direct
;saut indirect à l'adresse contenue dans BX
Les instructions de saut testant un flag.
Saut conditionnel :
JC / JNC
JS / JNS
JO / JNO
JP / JNP
JZ / JNZ
Jump if Carry / not Carry
Jump if Sign/ not Sign
Jump if Overflow / not Overflow
Jump if Parity / not Parity
Jump if Zero / not Zero
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
14
Assembleur 8086
Les Principales Instructions de l’assembleur
Les instructions de saut sur test arithmétique signé.
JE
JNE
JG
JGE
JL
JLE
Jump if Equal
Jump if Not Equal
Jump if Greater
Jump if Greater or Equal
Jump if Less
Jump if Less or Equal
Les instructions de saut sur test arithmétique non signé.
JA
JAE
JB
JBE
Jump if Above
Jump if Above or Equal
Jump if Below
Jump if Below or Equal
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
15
Assembleur 8086
Les Principales Instructions de l’assembleur
Les instructions de boucle: LOOP, LOOPE et LOOPNE.
Syntaxe:
LOOP
LOOPE
LOOPNE
etiquette
etiquette
etiquette
Exemple: Sommation des éléments de 0 à 100
Assembleur:
_sommation proc near
MOV
CX,100
MOV
AX,0
Boucle: ADD
AX,CX
LOOP Boucle
_sommation endp
Lotfi BOUSSAID
langage ‘C’:
int near sommation(void) {
int x=0;
_CX=100;
do {
x=x+_CX;
_CX=_CX-1;
} while (_CX!=0);
return(x);
Microprocesseurs & Microcontrôleurs
16
Assembleur 8086
Les Principales Instructions de l’assembleur
Les instructions sur chaînes de caractères
MOVS (ou MOVSB, MOVSW), CMPS, SCAS, LODS et STOS
Exemple:
Assume CS: Code DS: Data
Data Segment
table_1 db 5 dup(?)
table_2 dw 4 dup(?)
initial_1 db 1,2,5,4,9
initial_2 dw 1000,1002,1005,1008
Data ENDS
Code Segment
@1: mov ax,data ;initialisation segment de
;données
mov ds,ax
mov es,ax
mov cx,5 ; 5 élément à transférer
Cld
; transfert dans le sens croissant
Lotfi BOUSSAID
mov si,offset initial_1
mov di,offset table_1
rep movsb
mov cx,4
mov si,offset initial_2
mov di,offset table_2
rep movsw
mov ah,4ch
int 21h
; adresse du tableau source dans SI
; adresse du tableau destination dans DI
; transfert des éléments de initial_1 vers
; table_1
; nombre d’éléments à transfere
; adresse du tableau source dans SI
; adresse du tableau destination dans DI
; transfert des éléments de initial_2 vers
; table_2
; Fin du programme et retour au système
; d’exploitation
Code Ends
End @1
Microprocesseurs & Microcontrôleurs
17
Assembleur 8086
Notion de procédure
Instructions CALL et RET.
L'instruction CALL effectue donc les opérations :
 Empiler la valeur de IP. A ce moment, IP pointe sur l'instruction qui suit le CALL ;
 Placer dans IP l'adresse de la première instruction de la procédure (donnée en
argument).
 Et l'instruction RET : Dépiler une valeur et la ranger dans IP.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
18
Assembleur 8086
Exemple:
Calcul PROC
instruction1
instruction2
RET
Calcul
ENDP
near
; procedure nommée Calcul
; instructions
; instructions
; dernière instruction
; fin de la procédure
CALL address
PC
(SP)
(SP) – 1
SP
PC
(PC) + 3
(PC)H
(PC)L
(SP) - 2
address
Lotfi BOUSSAID
RET
PCL
PCH
SP
;Retour de sous-prog
((SP) + 1)
((SP) + 2)
(SP) + 2
Microprocesseurs & Microcontrôleurs
19
Assembleur 8086
Exemple:
SOMME PROC NEAR
ADD AX, BX
RET SOMME ENDP
; AX <- AX + BX
; fin de la procédure
Et puis son appel, par exemple pour ajouter 6 à la variable Truc :
MOV AX, 6
MOV BX, Truc
CALL SOMME
MOV Truc, AX
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
20
Assembleur 8086
Title : les procédures
Pile segment stack
dw
100
dup (?)
Basedepile equ thisword
Pile ends
data segement
message db
’bonjour, monde!’, 10,13, ‘$’
data ends
code segment
assume cs:code, ds:code, ss:pile
debut:
MOV AX, data
MOV DS, AX
MOV AX, Pile
MOV SS, AX
MOV SP, basedepile
boucle:
MOV CX,12
call ecritmessage
LOOP boucle
mov AX, 4C00h
INT 21H
; initialise le segment de pile
; appel de procédure
; décrementer CX de une unité et aller à
; boucle si CX est différent de 0
; terminer le programme ici par le retour au DOS
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
21
Assembleur 8086
Title : les procédures
ecritmessage proc near ;notre fonction
mov ah, 09h
move dx,offset message
int 21h
ret
ecritmessage endp
; fin de la procédure/fonction
code ends
end debut
; fin du segment de code
; fin de la porte d’entrée
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
22
Assembleur 8086
Déclaration de variables
Les variables se déclarent de la manière suivante:
datas1 db ?
; datas1 est un byte non initialisé
datas2 db 0FFh
; datas2 est un byte initialisé à FF (255 en hexadécimal)
datas3 dw ?
; datas3 est un word (16 bits)
datas4 db 5 dup (?)
; datas4 est un tableau de 5 bytes non initialisés
datas5 dw 10 dup (15)
; datas5 est un tableau de 10 byte initialisés à 15
De manière générale:
DB
: 1 byte (8 bits) (Declare Byte)
DW
: 1 word (16 bits) (Declare Word)
DD
: 2 words (32 bits) (Declare Double)
DF,DP
: 6 bytes
DQ
: 8 bytes (64 bits)
DT
: 10 bytes
Les constantes peuvent être écrites en:
- décimal: 1, 2, 3, 123, 45
- hexadécimal : 1h,2h,3h,12h,0Fh,0AD4h (noter la présence du 0 quand le premier chiffre du
nombre en hexadécimal commence par une lettre)
- binaire : 1b,0b,1010b,111101b
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
23
Assembleur 8086
Les entrées Sorties en assembleur
• Pour réaliser les opérations standards (affichage, saisie), le système
d’exploitation (ici DOS) fournit les fonctions pré-écrites suivantes:
•
•
•
Affichage d’un caractère :
mov DL, “A”
; caractère A est transfère dans DL
mov AH, 2
; fonction no. 2
int 21h
; appel au DOS
Affichage d’une chaine de caractères :
mov DX, offset chaine
; pointe vers l’adresse du premier caractère de
; la chaîne de caractères chaine
mov AH, 09h
; fonction no. 9
int 21h;
Saisie d’un caractère :
mov AH, 1
; fonction no. 1 (avec écho)
int 21h
; résultat est mis dans AL
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
24
Assembleur 8086
Les entrées Sorties en assembleur
•
Saisie d’un caractère
mov AH, 7
int 21h
; fonction no. 7 (sans écho)
; résultat dans AL
•
Arrêt de programme:
mov AX, 4C00h
;
int 21h
;
À mettre à la fin de chaque fin programme; c’est l’équivalent du return (0) en C. Ces
instructions ont pour effet de retourner au DOS.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
25
Assembleur 8086
L’équivalent de quelques instructions du langage
C en assembleur
• if then else
If ax =1
bx = 10;
else {
bx = 0;
cx = 10;
}
Assembleur
if:
CMP AX, 1
JNZ Else
Then: MOV BX,10
JMP endif
Else: MOV BX,0
MOV CX,10
endif: ..............
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
26
Assembleur 8086
L’équivalent de quelques instructions du langage
C en assembleur
• La boucle FOR
Assembleur
• For (k=0; k<=10; k++)
•
bx = bx + k;
For:
MOV BX,0
MOV CX,0
CMP CX,10
JA Endfor
ADD BX,CX
INC CX
JMP For
Endfor:
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
27
Assembleur 8086
L’équivalent de quelques instructions du langage
C en assembleur
• WHILE
Assembleur
• bx = 5
• while (bx >0)
bx = bx -1;
MOV BX,5
CMP BX,0
JLE Endwhile
DEC BX
JMP while
while:
Endwhile:
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
28
Assembleur 8086
L’équivalent de quelques instructions du langage
C en assembleur
• SWITCH
Assembleur
switch (n) {
case 1: ....; break;
case 2: .....; break;
default: .....;
}
CMP n,1
JNE case2
............
JMP endswitch
case2: CMP n,2
JNE default
..........
JMP endswitch
default: ...........
endswitch: ...........
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
29
Assembleur 8086
L’équivalent de quelques instructions du langage
C en assembleur
Écrire le code de l’instruction
if (a>b) && (c <= d)
{
................
}
En assembleur
if: cmp a, b
jng endif
cmp c, d
jnle endif
..............
endif:
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
30
Assembleur 8086
Liste des registres les plus utilisés
A. Registres généraux
• AX (A pour accumulateur): joue le rôle d’opérande implicite dans plusieurs
opérations: MUL, DIV, INC, etc.
• CX (C pour compteur): est utilisé pour les boucles (instruction LOOP).
• DX: utilisé dans les multiplications et divisions comme registre d’extension.
• SI (Source Index): souvent utilisé comme pointeur sur une adresse mémoire
(exemple: MOV AL, [SI]). Il est très utilisée avec les instructions de traitement de
chaînes de caractères (LODS).
• DI (Destination Index): pareil que SI (instruction STOS)
• BP (base pointeur): sert de pointeur sur la base de la pile, et permet d’atteindre
n’importe quel élément de la pile (exemple:
MOV AX,[BP+2]).
• SP (Stack pointer): pointe sur le sommet de la pile; son contenu est
automatiquement changé par les instructions PUSH et POP.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
31
Assembleur 8086
Liste des registres les plus utilisés
B. Registres spéciaux
• IP (Instruction pointeur): contient l’adresse de l’instruction qui suit celle qui est en
cours d’exécution.
• DS (Data Segment): Pointe sur le début du segment qui contient les données
• CS (Code Segment): Pointe sur le segment qui contient le code du programme.
• ES (Extended Segment) : permet de pointer sur un segment supplémentaire défini
par le programmeur. Il se charge par l’intermédiaire de AX, comme pour DS.
• SS (Stack Segment): segment contenant la pile.
C. Registre indicateur : utilisé pour sauvegarder des états particuliers du
microprocesseur en référence à la dernière instruction exécutée. Quelques bits
seulement de ce registre ont une signification sont nommés: CF (retenue), OF
(débordement), etc.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
32
Assembleur 8086
Les Indicateurs d’état
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
33
Assembleur 8086
Format standard d’une instruction
Label: Mnémonique Opérandes ;commentaire
Label:
Est un identificateur permettant de désigner un endroit dans le code source, soit
une instruction, soit une donnée. Si le label est placé avant une instruction, on fait
référence à l’adresse de cette instruction. Si c’est avant une donnée, on fait
référence à l’adresse de cette instruction.
Le label de code doit se terminer par deux points (:). Il sert général comme
destinations des instructions ou des retour de début des boucles de répétition.
Le label de donnée ne contient pas les deux points(:) à la fin. Il sert dans ce cas là
comme identificateur.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
34
Assembleur 8086
Liste des registres les plus utilisés
• Mnémonique (des instructions): il sert à identifier une
instruction donnée. Quelques instructions de base sont
résumées dans la prochaine section.
• Opérandes: une instruction assembleur peut avoir de 0 à 3
opérandes. Chaque opérande peut être le nom d’un registre,
un opérande mémoire, une expression constante ou le nom
d’un périphérique entrée/sortie.
• Commentaire: précédé du point-virgule (;). Il sert à à ajouter
des informations explicatives au sujet du fonctionnement du
programme ou de l’instruction correspondante.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
35
Assembleur 8086
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
36
Assembleur 8086
JZ
Saut si zéro.
JE
Saut si égal.
JC
Saut si Retenue (inférieur).
JNC
JB
Saut si inférieur.
JNB
JNAE
Saut si ni supérieur ni égal.
CF = 1
JAE
JS
Saut si signe négatif.
SF = 1
JNS
JO
Saut si débordement.
OF = 1
JNO
JPE
Saut si parité paire.
JP
Saut si parité.
PF = 1
JPO
JNZ
Saut si pas zéro.
JNE
Saut si différent.
JNC
Saut si pas de retenue.
JC
JNB
Saut si pas inférieur.
JB
JAE
Saut si supérieur ou égal.
CF = 0
JNAE
JNS
Saut si aucun signe (positif).
SF = 0
JS
JNO
Saut si pas de débordement.
OF = 0
JO
JPO
Saut si parité impaire.
JNP
Saut si pas de parité.
Lotfi BOUSSAID
JNZ
ZF = 1
JNE
JZ
ZF = 0
JE
JPE
PF = 0
JP
Microprocesseurs & Microcontrôleurs
37
Assembleur 8086
Instruction CMP (Comparer)
CMP destination, source
Compare
Opérandes
CF
ZF
Dest. > Src.
0
0
Dest. = Src.
0
1
Dest. < Src.
1
0
L’instruction CMP affecte les indicateurs AF, OF, SF, PF, CF et ZF
mais seuls CF et ZF sont utilisés.
L’opérande destination peut être dans un registre ou dans une mémoire.
L’opérande source peut être dans un registre, dans une mémoire, ou en mode immédiat.
Les opérandes (destination et source) ne changent pas.
DATA1
…
PASSE:
TEMP
…
PROCHAIN:
DW
235FH
MOV
MOV
CMP
JNC
ADD
ADD
BX, 7888H
CX, 9FFFH
BX, CX
PASSE
BX, 4000H
CX, DATA1
DB
?
MOV
CMP
JZ
INC
HLT
AL, TEMP
AL, 99
PROCHAIN
BX
; 7888Hh  BX
; BX < CX  CF=1  JNC est exécutée  PASSE
; Note: les contenus de (BX, et CX) ne changent pas après CMP
; mais CF est toujours vérifié pour (< ou >). Pour (=) on utilise ZF.
; TEMP  AL
; TEMP = 99?. Avec (SUB AL, 99), la même chose mais 0  AL
; Si ZF=1 (TEMP=99), Saute a PROCHAIN:
; Sinon incrémente BX
; Arrêt du programme
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
38
Assembleur 8086
TITLE prog1.asm: Exemple sur CMP, Trouver l’octet le plus grand parmi 5 notes d’élèves
PILE segment stack
dw 100 dup(?)
PILE ends
;------------------------------------------------------------------------------------------------------------------------------------------------------------DATA segment
NOTES
DB
18, 06, 19, 11, 08
PLUS_G DB
?
DATA ends
;-----------------------------------------------------------------------------------------------------------------------------------------------------------CODE segment
main:
assume CS:CODE, DS:data ; génération de l’adresse du segment de code et de données
MOV AX, DATA
; Initialiser le registre DS pour récupérer l’adresse du segment de donnée
MOV DS, AX
MOV CX, 5
; compteur de boucle
MOV BX, OFFSET NOTES
; BX pointe vers les données NOTES
XOR AL, AL
; Initialise AL à 0; va héberger la plus grande note
ENCORE:
CMP AL, [BX]
; compare la note prochaine a la note la plus élevée
JA PROCHAIN
; Sauter si AL est encore la note la plus élevée
MOV AL, [BX]
; sinon AL retient la plus élevée
PROCHAIN: INC BX
; pointe vers la prochaine note
LOOP ENCORE
; CX décrémente jusqu’à 0 pour sortir de la LOOP
MOV PLUS_G, AL
; sauvegarde de la note la plus élevée dans PLUS_G
;------------------------------------------------------------------------------------------------------------------------------------------------------------MOV AH, 4Ch
INT 21h
CODE
ENDS
END MAIN
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
39
Assembleur 8086
TITLE prog2.asm: Exemple sur ROL, Trouver le nombre de ‘1’ dans un mot
Pile segment stack ; déclaration d’un segment de pile – pas nécessaire dans notre cas
dw 100 dup(?)
Pile ends
;-----------------------------------------------------------------------------------------------------------------------------------------------------------DATA segment
DATA1 DW
5F97H
COMPTE DB
?
DATA ends
;------------------------------------------------------------------------------------------------------------------------------------------------------------CODE segment
MAIN:
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS, AX
XOR
BL, BL
; Mettre BL à 0 (ou bien SUB)
MOV
DL, 16
; rotation 16 fois
MOV AX, DATA1
ENCORE:
ROL AX, 1
; Rotation a gauche (a droite aussi si on préfère)
JNC
PROCHAIN
; Test si CF=0
INC BL
; Si CF = 1, incrémenter le compteur du nombre de ‘1’
PROCHAIN: DEC DL
; répéter 16 fois
JNZ ENCORE
; encore une fois si ce n’est pas fini
MOV COMPTE, BL
; sauvegarder le résultat dans la case mémoire COMPTE
;-----------------------------------------------------------------------------------------------------------------------------------------------------------MOV AH, 4Ch
INT
21h
CODE
ENDS
END MAIN
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
40
Assembleur 8086
Un mot sur les macros
Étant donné que certaines instructions se répètent constamment dans un
programme, l’écriture de macro-fonctions (ou macros) est un moyen pratique
de rendre votre code source plus lisible.
Il est possible de choisir pour certaines suites d’instructions un nom qui les
représente. Lorsque l’assembleur rencontrera ce nom dans votre code source,
il le remplacera par les lignes de code qu’il désigne. Ces lignes forment une
« macro ».
Les macros, à la différence des procédures, n’ont aucune signification pour la
machine. Seul l’assembleur comprend leur signification. Elles ne sont qu’un
artifice mis à la disposition du programmeur pour clarifier son programme.
Lorsque l’assembleur rencontre le nom d’une macro dans votre code, il le
remplace par le code de la macro. Tout se passe exactement comme si vous
aviez tapé vous-même ce code à la place du nom de la macro.
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
41
Assembleur 8086
Exemple de Macro
affiche macro chaine
push dx
mov dx,offset chaine
mov ah, 09h
int 21h
pop dx
endm
; nom macro paramètres
; sauvegarder le contenu de DX, par
; exemple, en utilisant la pile
; sauvegarde de dx dans la pile
; restauration de dx
;fin de la macro
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
42
Assembleur 8086
TITLE ex3_somme
PILE SEGMENT STACK
; somme de deux nombres
; déclaration de pile.
; Pour cet exemple, la pile n’est pas nécessaire.
DW 100 DUP (?)
PILE ENDS
affiche macro chaine
MOV DX,offset chaine
MOV AH, 09h
INT 21h
ENDM
; macro pour afficher une chaîne de caractères
; offset renvoie l’adresse de début de chaine
; fonction qui affiche une chaîne de caractères
; fin de la macro
DATA SEGMENT
; déclaration de variables
val1 db 0
val2 db 0
recup_val1 db 10,13,'veuillez taper la valeur1',10,13,'$' ; 10 et 13=endl du C++
recup_val2 db 10,13,'veuillez taper la valeur2',10,13,'$‘
aff_resu db 10,13,'la valeur saisie est:',32,'$' ; $ caractère de fin de chaine
DATA
ENDS
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
43
Assembleur 8086
SCODE SEGMENT
ASSUME CS:SCODE, DS:DATA
DEBUT:
MOV AX, DATA
MOV DS, AX
; zone de code
; génération de l’adresse du segment de code et de données
; entrée du code
; Initialiser le registre DS pour récupérer l’adresse du
; segment de donnée
; à partir d’ici on peut placer nos lignes de code
affiche recup_val1
; appel de macro pour afficher un message contenu dans
;recup_val1
; faire une lecture au clavier grâce à la fonction 1 le
;caractère tapé sera placé dans AL
MOV AH,1
INT 21h
MOV val1,AL
affiche recup_val2
MOV AH,1
INT 21h
ADD AL,val1
MOV val2,AL
; appel de la macro pour afficher un message sur écran
;faire une lecture au clavier
; AL = AL + val1
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
44
Assembleur 8086
affiche aff_resu
SUB val2,30h
; appel de la macro pour afficher un message sur écran
; les valeurs lues tantôt sont en ascii; exemple :
; si on tape les valeurs 1 et 2,
; le programme récupère 31 et 32, valeurs
; hexadécimales des caractères 1 et 2.
; Donc 31 + 32 = 63. et 63 n’est pas la valeur hexa
; du caractère 3. Sa valeur est 33
; autrement dit, on doit retirer 30 en hexa ou 48 en
; décimal.
; afficher la valeur saisie grâce à la fonction 2
; qui affiche le contenu de DL
MOV AH,2
INT 21h
MOV DL,val2
MOV AH, 4Ch
MOV AL, 0
INT 21h
CODE
ENDS
END DEBUT
; on termine le programme avec la fonction
; 4c en hexa. On place une valeur >=0 pour dire
; que l’exécution s’est déroulée correctement.
; Équivalent en c de return 0
; fin du segment de code
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
45
Assembleur 8086
Expression arithmétique : X = (A*2 + B*C)/(D-3)
.......
Data segment
X dw ?
A dw ?
B dw ?
C dw ?
D dw ?
Data ends
Arithmetique proc near
MOV AX, 2
IMUL A
MOV BX,DX
MOV CX,AX
MOV AX,B
IMUL C
ADD AX,CX
ADC DX,BX
MOV CX, D
SUB CX,3
IDIV CX
MOV X,AX
RET
Arithmetique endp
............
;établir la constante
;DX:AX = A*2
;
;BX:AX = A *2
;DX:AX = B*C
;AX = AX + CX ! faites attention, il peut y avoir une retenue ici
;DX:AX = A*2+B*C + la retenue s’il y a lieu avec ADC
; cx = D -3
; AX =(A*2 + B*C)/(D-3)
; X = ax (A*2 +B*C)/(D-3) stocker le résultat
; fin de la procedure
Lotfi BOUSSAID
Microprocesseurs & Microcontrôleurs
46
Téléchargement