FR - Instructions ASM
FR - Instructions ASM
FR - Instructions ASM
Instructions assembleur
0001011011110110
0001011101101101
10001001
3. 1
Instructions assembleur
1. Programme binaire
● Généré par le compilateur (ou écrit par le programmeur en langage
machine)
● Ensemble d'instructions machine chargées en mémoire centrale lors
de l'exécution d'un programme
● Les instructions sont exécutées séquentiellement
PC (Program Counter) contient l'adresse de l'instruction à exécuter
mémoire centrale
..... si le programme commence
0001011011110110 à l'adresse 5000h PC vaut 5000h
PC
0001011101101101 puis 5002h puis 5006h ....
0011000100100100
3. 2
Instructions assembleur
.text .text
directives .globl main
.globl _main
_main: .type main,@function
étiquettes movel _i,d0 Les instructions main:
addl _j,d0 movl j, %eax
movel d0,d1 addl i, %eax
addl _k,d1 addl k, %eax
movel d1,_i movl %eax, i
3. 3
Instructions assembleur
2. Jeu d'instructions
●
Une instruction est définie par :
– l'opération à réaliser que faire ?
3. 4
Instructions assembleur
●
Quelles instructions ?
– quelles opérations élémentaires ? (différentes utilisations : DSP,
multimédia, CPU...)
– quels types de données ? (booléens, flottants, entiers, codes ASCII, BCD)
●
Objectif : assurer les meilleures performances en terme de
– rapidité d'exécution
– taille du code
– facilité d'utilisation (écriture des compilateurs)
●
Tendance : simplicité du jeu d'instructions et du codage (même
format d'instruction, même temps d'exécution)
RISC : Reduced Instruction Set Computers
3. 5
Instructions assembleur
En binaire : 0010 0010 0011 1001 0000 0000 0000 0000 0000 0000 0010 0000
En hexadécimal : 2239 0000 0020h
3. 6
Instructions assembleur
3. Format d'instruction
●
L'instruction est représentée par un code binaire. Ce code
binaire est découpé en champs ayant des rôles différents : c'est
le format d'instruction.
CODE MODE OP1 OP2
●
Le format d’instruction peut varier selon le type des opérandes
●
Tendance : un format uniforme
3. 7
Instructions assembleur
Exemple : PROCSI
• Langage assembleur : <inst> <op-dest> , <op-source>
page 3/4
Exemple : add R1, R4
3. 8
Instructions assembleur
3. 9
Instructions assembleur
* Source :http://www.irisa.fr/caps/projects/TechnologicalSurvey/micro/PI-957-html
3. 10
Instructions assembleur
4. Opérandes
3. 11
Instructions assembleur
Organisation mémoire :
0 Accès à un mot ou double :
0 1
Accès à un octet : 1 adresse paire 2 3
2 4 5
adresse paire
3 . .
ou impaire . . .
.
3. 12
Instructions assembleur
3. 13
Instructions assembleur
Modes d'adressage usuels
Mode Informations codées Mode de calcul de Utilisation
d'adressage dans l’instruction l'opérande
Immédiat op = valeur immédiate op constantes
la valeur elle-même i = 6;
Registre op = numéro registre reg[op] calculs intermédiaires
for (int i =0;i<100;i++)
le registre interne n° op x = x+ y*x +2*y
Direct ou op = adresse mem[op] accès variables statiques
absolu la case n° op de la
int i;
mémoire centrale
page 4
Représentation Effet Mode adressage Code
ADD R1, R5 REG[1] <- REG[1] + REG[5] registre/registre 000000 0000 101 001
Addition des registres 1 et 5 000000 : addition
Le résultat va dans le registre 1 0000 : mode registre / registre
001 : la destination est le registre n°1
011 : la source est le registre n°5
ADD R2, # 24 REG[2] <- REG[2] + 24 registre/immédiat 000000 0100 xxx 010
0000000000011000
24 est additionné au registre R2 000000 : addition
0100 : mode registre / immédiat
010 : la destination est le registre n°2
XXX : il n'y a pas de registre source
0000000000011000 : 24, la donnée immédiate
ADD [8], # 24 MEM[8] <- MEM[8] + 24 direct/immédiat 000000 0101 xxx xxx
0000000000011000
0000000000001000
24 est additionné à la case mémoire n°8 000000 : addition
0101 : mode direct / immédiat
XXX : il n'y a pas de registre mis en jeu
0000000000011000 : 24, la donnée immédiate
0000000000001000 : 8, l'adresse de la case mémoire
3. 15
Instructions assembleur
3. 16
Instructions assembleur
ADD R2, 8[R5] REG[2] <- REG[2] + MEM[REG[5]+ 8] registre/déplacement 000000 1001 xxx 010
0000 0000 0000 1000
Additionne le registre 2 et le mot mémoire
Dont l'adresse est le contenu de R5 + 8
Le résultat va dans le registre 2
3. 17
Instructions assembleur
MEM REG
Adresse Contenu Numéro Contenu
8 T[0] 0
9 1
10 2
11 3
12 T[1] 4
13 5 8
14 6
15 7
Sachant que les “int” en Java sont codés sur 32 bits (soit 4 cases
mémoire), à quoi correspond 8[R5] ?
T[5]
T[8]
T[2]
3. 18
Instructions assembleur
3. 19
Instructions assembleur
3. 20
Instructions assembleur
Exemple PROCSI
PC = 8000h
8000h : 000000 0000 010 001 ADD R1, R2 PC <- 8000h + 1 séquentiel
8001h : 000000 0100 xxx 001 ADD R1, #24 PC <- 8001h + 2
8002h : 0000000000011000
8003h : 000100 xxxx xxx xxx JMP 8360h PC <- 8360h contrôle
8004h : 1000 0011 0110 0000
8005h : .................................
.......... : ................................
8360h : 000000 0000 110 000 ADD R0, R5
3. 21
Instructions assembleur
• Adresse de branchement
– le programme est écrit avec une étiquette symbolique,
– l’adresse relative du branchement est connue lors de la phase de compilation,
– l’adresse réelle du branchement est connue lors du chargement du programme en
mémoire centrale (dépend de la machine).
• Condition de branchement
– test sur le résultat d'une opération arithmétique ou logique
Exemple : résultat nul, résultat positif, retenue …
• La condition est
– générée par l'unité de calcul de l'unité centrale (ALU)
– stockée dans un registre spécial accessible par la partie contrôle (SR)
-> la partie contrôle prend en entrée la valeur de SR pour savoir si le branchement
doit être pris
3. 22
Instructions assembleur
● branchement conditionnel
si condition vraie PC <- adresse branchement
sinon PC inchangé
if then else, while, for
● appel procédure
"PC_sauv "<- PC
PC <- adresse branchement
● retour procédure
PC <- "PC_sauv"
3. 23
Instructions assembleur
Exemple: PROCSI
3. 24
Instructions assembleur
Exemple: PROCSI
Conditionnel
PC = 8301h : PC <- 8302h; R1 <- R1 + R2
Si R1 = - R2:
8301h add R1, R2
8302h jeq suite PC = 8302h : PC <- 8304h; PC <- 8600h
8304h sub R1, R4
… … PC = 8600h : PC <- 8602h; MEM[80] <- R1
suite:
8600h store [80],R1 Si R1≠ - R2:
PC = 8302h : PC <- 8304h;
PC = 8304h: PC <- 8306h; R1 <- R1 - R4
3. 25
Instructions assembleur
On suppose que le compilateur a associé le registre R1 à la variable x,
le registre R2 à la variable y et le registre R3 à la variable z
Quel code PROCSI correspond à : x = x + y;
if (x!=10) x = x + 22;
z++;
3. 27
Instructions assembleur
5.4. Procédures
• Le code de la procédure utilise les paramètres
• La valeur des paramètres est connue lors de l'exécution
• Le nombre d’appels n’est pas toujours connu de façon statique : appels dans un
if, appels imbriqués de procédures, procédures récursives, ...
Il faut un mécanisme de saut pour “aller” à la procédure, et il faut un
mécanisme pour en revenir
3. 28
Instructions assembleur
1. Séquence d'appel
Programme appelant
empiler les paramètres
empiler l'adresse de retour (PC courant)
PC prend l'adresse de la procédure
Dans la procédure :
- “push” pour sauvegarder les registres modifiés par la procédure
- récupère les paramètres dans la pile : adressage mémoire avec déplacement
par rapport à SP
- calcul
- “pop” pour restituer les valeurs initiales des registres
- “ret” : la valeur en sommet de pile est dépilée et placée dans PC
3. 30
Instructions assembleur
variable à l'adresse 50 main à l'adresse 1000h
public static void main(String [] s){
int a = plus(3, 8); procédure à l'adresse 8000h
a++;
} instruction à l'adresse 1008h
3. 32