Cours 8 : Mémoire et Registres
Q8.1 : À l’aide de la datasheet du cœur ARM ou d’un simulateur, dites quels bits
formeraient l’instruction ARM MOV R3,#4 ?
0xE3A03004
Q8.2 : Supposons des nombres signés sur 8bits. Sous quelles conditions les additions
suivantes change-t-elles les drapeaux C et V de l’ALU (si elles le peuvent!):
- Nombre Positif + Nombre Positif
- Nombre Positif + Nombre Négatif
- Nombre Négatif + Nombre Négatif
Positif + Positif :
C est toujours 0. V est 1 si le bit MSB de la somme est 1 (Somme supérieure à 127), 0 sinon.
Positif + Négatif :
V est toujours 0. Le bit carry est 1 si le résultat de l’opération est positif, 0 sinon.
Négatif + Négatif :
C est toujours 1. V est 1 si le bit MSB de la somme est 0 (Somme inférieure à -128), 0 sinon.
Q8.3 : Pourquoi faut-il 4 bits pour désigner le registre source ou destination d’une
opération dans le cœur ARM?
Parce que le cœur ARM a 16 registres.
Q8.4 : Supposons que R0 = 11111111h; R2 = 22222222h; R3 = 33333333h; R4 =
44444444h. Le contenu de quelles adresses se retrouvera dans R5 suite aux instructions
suivantes:
1) LDR R5,[R0]
2) LDR R5,[R0,R1,ASL#2]
3) LDR R5,[R0,#4]!
1) R5 = Mem[11111111h]
2) R5 = Mem[33333331h]
3) R5 = Mem[11111115h]
Q8.5 : Quelle(s) instruction(s) pourrions-nous utiliser pour mettre les deux bits LSB de R0
à 0? pour les mettre à 1? Les autres bits ne doivent pas changer et la valeur initiale des bits
est inconnue.
AND R0, R0, #-4
ORR R0,R0,#3
Q8.6 : Écrivez un programme qui multiplie par 2 un entier signé placé en mémoire sur 32
bits. Supposez que ce nombre commence à l’adresse 02000000h et qu’il finisse à l’adresse
02000003h (Little Endian).
AdresseDeVar DC32 0x02000000
LDR R0, AdresseDeVar
LDR R1, [R0]
MOV R1, R1, ASL#1
STR R1, [R0]
Q8.7 : Quelle instruction permet d’inverser le signe d’un nombre ? Donnez une
combinaison de deux instructions ayant 1 seule opérande conduisant au même résultat.
Supposons que R2 contiennent le nombre à multiplier par -1 :
MOV R1,#-1
MUL R2,R2,R1
MVN R2,R2
ADD R2,R2,1
Q8.8 : Dites si les instructions de déplacement ou d’accès à la mémoire qui suivent sont
légales ou illégales :
MOV R1, MaVar ;Illégal
MOV R1, #4 ;Légal
MOV #4, R1 ;Illégal
LDR R1,[MonAdresse] ;Illégal
LDR R1,[R0] ;Légal
LDR R1,[R0,#4] ;Légal
LDR R1,[R0,MonOffset] ;Illégal
Q8.9 : Quelle est la différence entre LDR et LDM?
L’instruction LDR lit une seule valeur en mémoire pour la mettre dans le registre visé. LDM
lit plusieurs valeurs pour les mettre dans plusieurs registres
Q8.10 : À quoi sert le « ! » dans l’instruction LDR ou STR ?
Changer la valeur du registre désignant l’adresse de mémoire avant ou après l’opération.
Q8.11 : Retrouve-t-on le nom des variables et des fonctions dans la mémoire du
microprocesseur ? Si oui, comment ? Si non, pourquoi ?
Non, le microprocesseur travaille avec des adresses seulement.
Q8.12 : Quelle directive assembleur permet de déclarer des tableaux de constantes?
DC
Q8.13 : Vous voulez effectuer l’opération a = b + c + d. Sachant que a, b, c et d sont des
variables déclarées avec DS, donnez une séquence d’instructions permettant de faire cette
addition.
LDR R0,=a
LDR R1,=b
LDR R2,=c
LDR R3,=d
LDR R4,[R1]
LDR R5,[R2]
LDR R6,[R3]
ADD R4,R5,R6
STR R4,[R0]
Q8.14 : Comment change-t-on les drapeaux de l’ALU. À quoi servent-ils ?
Presque toutes les instructions ARM peuvent changer les drapeaux de l’ALU avec l’option S.
Les drapeaux changent en fonction du résultat de l’opération arithmétique ou logique. Ils
servent à évaluer des conditions (exemple : si a>8).
Q8.15 : Pourquoi le cœur ARM ne supporte pas d’instruction pour faire des décalages ou
des rotations de bits ?
En raison du barrel shifter dans l’ALU : il est possible de faire des rotations de
décalages/rotations de bits avec presque toutes les instructions microprocesseur. Pour décaler
un bit vers la droite de R1, par exemple, on peut utiliser MOV R1, R1, ASR #1
Q8.16 : Expliquez pourquoi, lorsqu’on décale des bits vers la droite de 1, il faut
habituellement copier le bit le plus significatif à gauche ?
Pour conserver le signe d’un nombre négatif
Q8.17 : Lorsque vous encodez l’instruction ADD R0, R1, #constante, quelles sont les
valeurs permises de la constante et pourquoi?
Offset peut valeur de -256 à 255. L’instruction est sur 32 bits et 9 bits sont réservés à la valeur
de la constante, les autres bits étant pour l’opcode et les autres paramètres.
Q8.18 : Si on suppose un microprocesseur ARM ayant deux registres seulement et un
ordinateur ayant une mémoire RAM qui commence à l’adresse 0x20000000. En assumant
que toutes les variables sont réutilisées plus loin, comment seraient assemblées les
opérations mathématiques suivantes :
int A,B,C,D,E //Les variables sont sur 32bits
A = 3
B = 4
C = A+B
D = A+B+C+5
La première chose à faire est d’assigner une adresse à A,B,C,D et E, comme le font
l’assembleur et l’éditeur de lien. Choisissons arbitrairement que A aura l’adresse 0x20000000,
B aura l’adresse 0x20000004, C aura l’adresse 0x20000008, D aura l’adresse 0x2000000C et
E aura l’adresse 0x200000010.
Ensuite les adresses des variables seront placées dans la mémoire FLASH comme des
constantes parce qu’on ne peut pas mettre une adresse 32 bits à l’intérieur d’une instruction 32
bits. Le compilateur mettra l’adresse en FLASH avant ou après le code…
Enfin, il faut faire le code. L’assembleur choisira des registres pour effectuer les différentes
opérations. Les registres seront utilisés pour entreposer des constantes, des adresses ou des
résultats de calculs…
B Debut
AdresseDeA DC32 0x20000000
AdresseDeB DC32 0x20000004
AdresseDeC DC32 0x20000008
AdresseDeD DC32 0x2000000C
AdresseDeE DC32 0x20000010
Debut:
;A = 3
MOV R0,#3
LDR R1, AdresseDeA ;Compilé comme LDR R1, [PC, #16]
STR R0,[R1]
;B = 3
MOV R0,#4
LDR R1, AdresseDeB ;Compilé comme LDR R1, [PC, #24]
STR R0,[R1]
;C = A+B; sans optimisation, i.e. sans tenir compte des opérations précédentes
LDR R0, AdresseDeA
LDR R0,[R0]
LDR R1, AdresseDeB
LDR R1,[R1]
ADD R0,R0,R1
LDR R1, AdresseDeC
STR R0, [R1]
;D = A+B+C+5; sans optimisation, i.e. sans tenir compte des opérations précédentes
MOV R0,5
LDR R1,AdresseDeC
LDR R1.[R1]
ADD R0,R0,R1
LDR R1,AdresseDeB
LDR R1.[R1]
ADD R0,R0,R1
LDR R1,AdresseDeA
LDR R1.[R1]
ADD R0,R0,R1
LDR R1,AdresseDeD
STR R0, [R1]
Cours 9 : Les Piles et les Branchements
Q9.1 : Si L et M sont strictement positifs (non-signés), quelle instruction doit-on utiliser et
quel drapeau doit-on vérifier afin de déterminer si L est supérieur ou égal à M?
;On assume que L et M sont comparés (soustraction, différence) avant le branchement conditionnel
; « CMP L,M » où les valeurs de L et M seraient dans des registres
Si L et M sont positifs :
Cas
Effet de L-M sur le
drapeau C
Effet de L-M sur le
drapeau Z
Effet de L-M sur le
drapeau V
L > M
C = 0
Z = 0
Dépend des valeurs de L
et M
L = M
C = 0
Z = 1
V = 0
L < M
C = 1
Z = 0
Dépend des valeurs de L
et M
Le drapeau C sera utilisé. L’instruction sera BCS (Branch Carry Set) ou BCC (Branch Carry Clear).
Q9.2 : Quelle est la différence entre l’instruction BX Reg et l’instruction B Offset?
Le X signifie eXchange. L’instruction BX Reg a deux effets : Reg = PC, PC = Reg.
Le X signifie eXchange. L’instruction B Offset a un seul effet : PC = PC + Offset + 8.
Q9.3 : À quoi sert le registre LR?
Il sert à faire le lien entre une fonction qui appelle une autre fonction : le registre LR
entrepose les adresses de retour (instruction BL).
Q9.4 : Le registre SP est-il incrémenté ou décrémenté lors d’un PUSH? Lors d’un POP?
Pourquoi varie-t-il toujours de 4?
Habituellement, SP est décrémenté lors d’un PUSH parce que la pile est habituellement
placée aux adresses supérieures de la RAM. Il varie de 4 parce que les mots et registres des
microprocesseurs ARM ont 32 bits.
Q9.5 : Écrivez une routine de calcul de la factoriel d’un nombre en assembleur ARM. Vous
routine doit posséder un paramètre d’entré (le nombre dont il faut calculer la factorielle) et
un paramètre de sortie (la factorielle du nombre). Passez les paramètres de la fonction par
registre.
Décidons d’abord que R0 contiendra le paramètre d’entrée et que R1 contiendra le résultat
R1 = R0! »). L’appel de la fonction se fera ainsi (Res = N!) :
LDR R0,=N
LDR R2,=Res
LDR R0,[R0]
BL Facto
STR R1,[Res]
La fonction pourrait être codée ainsi, avec une boucle qui multiple 1 par i à chaque itération
pour i = 1 jusqu’à N :
Facto
PUSH {R3, R4, LR} ;Fonction propre!
1 / 12 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!