Architecture des ordinateurs et programmation ASM en PDF
...
PC (Program Counter) contient l'adresse de l'instruction à exécuter mémoire centrale
.....
0001011011110110
0001011101101101
0011000100100100
PC
si le programme commence
à l'adresse 5000h PC vaut 5000h
puis 5002h puis 5006h ....
les instructions de contrôle (if else, boucle for, while, ...) modifient la valeur de PC
...
– l'opération à réaliser
– les opérandes : registres et cases mémoire modifiés / utilisés par l'instruction
– quelles opérations élémentaires ? (différentes utilisations : DSP, multimédia, CPU...)
– quels types de données ? (booléens, flottants, entiers, codes ASCII, BCD)
– rapidité d'exécution
– taille du code
– facilité d'utilisation (écriture des compilateurs)
RISC : Reduced Instruction Set Computers
Exemple d'instruction 68000
En binaire : 0010 0010 0011 1001 0000 0000 0000 0000 0000 0000 0010 0000
En hexadécimal : 2239 0000 0020h
La même chose lisible (langage assembleur) :
movel _i,d1
Le registre interne d1 reçoit le contenu de la variable en mémoire centrale i
CODE MODE OP1 OP2
Exemple : PROCSI
Exemple : add R1, R4
...
2ème mot : valeur immédiate ou adresse
3ème mot : adresse
Exemple : 000000 0000 0100 0001
...
Exemple : famille xx86 (Pentium)
très grand nombre d'instructions (synonymes) et modes d'adressage
syntaxe: op-code op-dest , op-source
Ex: add cx, bx
add cl, bl
mov 80[bx], ax
4.1. Registres internes
Registres généraux dans une mémoire statique interne, accessible en un top d’horloge processeur
Achaque fois que c'est possible
4.2. Opérandes mémoire :
la donnée est dans la mémoire centrale accès à un octet (8 bits), mot (16 bits), double mot (32 bits), mot long (64 bits)
Accès à un mot ou double :
adresse paire
…
Accès à un octet :
adresse paire
ou impaire
Initialisation de variables locales, tableaux
4.3. Modes d'adressage
– constante
– registre
– case mémoire
– Avoir autant de modes d'adressage que possible (facilité de programmation)
– Impact sur la taille des instructions et donc du programme
...
Quel est le code binaire de ADD R5,R7 ?
000000 0001 0011 0101
000000 0000 0111 0101
000000 0000 0101 0111
La variable i est à l'adr esse 9 dans la mémoire
Comment traduire l'instruction java “ i = i + 3”
ADD [9],R3
ADD [9],#3
ADD [9],[3]
Exemple: modes d'adressage de PROCSI suite ...
Représentation Effet Mode adressage Code
ADD R1, [R5] REG[1] <- REG[1] + MEM[REG[5]] registre/indirect 000000 1100 101 001
Additionne le registre 1 et
le mot mémoire dont l'adresse est dans R5
Le résultat va dans le registre 1
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
Si le tableau “int[] T” est à l'adresse 8 dans la mémoire, si le registre R5
contient la valeur 8 alors [R5] correspond à T[0]
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]
5.1. Classes d'opérations
Calculs
Transferts de / vers la mémoire
...
5.2. Instructions de contrôle
Rompt l'exécution séquentielle du programme
PC: registre «Program Counter» contient l'adresse de la prochaine instruction à exécuter
ce n'est donc pas l'instruction suivante qui est exécutée
Exemple PROCSI
8000h : 000000 0000 010 001 ADD R1, R2
8001h : 000000 0100 xxx 001 ADD R1, #24
8002h : 0000000000011000
8003h : 000100 xxxx xxx xxx JMP 8360h
8004h : 1000 0011 0110 0000
8005h : .................................
.......... : ................................
8360h : 000000 0000 110 000 ADD R0, R5
Exemple PROCSI
PC = 8000h
PC <- 8001h + 2
PC <- 8000h + 1 séquentiel
PC <- 8360h contrôle
adresses en hexa dans mémoire instruction
– 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).
– test sur le résultat d'une opération arithmétique ou logique
Exemple : résultat nul, résultat positif, retenue …
– 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
5.3. Catégories d'instructions de contrôle
PC <- adresse branchement
goto
si condition vraie PC <- adresse branchement
sinon PC inchangé
if then else, while, for
"PC_sauv "<- PC
PC <- adresse branchement
PC <- "PC_sauv"
Exemple: PROCSI
jmp : “jump”saut non conditionnel
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++;
add R1,R2
cmp R1,#10
jeq suite
add R1,#22
suite : add R3,#1
add R1,R2
cmp R1,#10
jne suite
add R3,#1
suite : add R1,#22
add R3,#1
add R1,R2
cmp R1,#10
jne suite
add R3,#1
jmp fin
suite : add R1,#22
add R3,#1
fin :
Instructions assembleur
Exemple : une boucle en C et en 68000
_main:
moveq #5,d0
movel d0,_i
L2:
moveq #9,d0
cmpl _i,d0
jge L5
jra L3
L5:
addql #1,_result
L4:
addql #1,_i
jra L2
L3:
rts
int result = 8;
int i=0;
main()
{
for (i = 5;i < 10; i++)
result++;
}
d0 vaut 5
i vaut d0
d0 reçoit 9
comparaison de i et d0
saut à L5 si i <= d0
saut à L3
result reçoit result+1
i reçoit i + 1
saut à L2
retour
Instructions assembleur
5.4. Procédures
Il faut un mécanisme de saut pour “aller” à la procédure, et il faut un mécanisme pour en revenir
Une pile pour gérer :
- le passage des paramètres
- l'appel de procédure
- le retour de procédure
Pile: zone contiguë de la mémoire centrale un registre spécialisé SP (stack pointer) du CPU contient l'adresse du sommet de pile
Instructions assembleur
Communication entre appelant et procédure
empiler les paramètres
empiler l'adresse de retour (PC courant)
PC prend l'adresse de la procédure
sauvegarde additionnelle de registres
allocation de pile pour variables locales
PC prend la valeur du sommet de pile
Programme appelant
Procédure
Procédure
Programme appelant
Le détail des appels de procédures sera vu en cours d’assembleur ARM
Instructions assembleur
Appel de la procédure dans le programme appelant :
- “push” pour chaque paramètre
- “call <adresse_proc>” : 1. empile l'adresse de retour (PC courant)
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
L'exécution continue dans la procédure
L'exécution continue dans le programme appelant
...
5.5. Interruptions
L'exécution normale du programme est interrompue pour raison logicielle ou matérielle
Trois mécanismes de base
Traitement identique à un appel de procédure mais :
– Sauvegarde du contexte du programme (pas seulement PC actuel)
– La routine d'interruption est stockée dans un endroit protégé de la mémoire
– L'appel de la routine d'interruption est fait par la partie contrôle dans le cas des conditions d'erreur et des interruptions matérielles
– Table d'interruption : fait le lien entre type d'interruption et adresse de la routine associée