Questions courtes 1) Répondre par vrai ou faux aux affirmations

publicité
Questions courtes
1) Répondre par vrai ou faux aux affirmations suivantes :
a)
b)
c)
d)
e)
f)
g)
h)
i)
L’architecture de Harvard est couramment utilisée dans les CPU CISC
Dans un microcontrôleur typique, le bus d’adresses n’est pas accessible de l’extérieur
La plupart des instructions ARM peuvent être exécutées conditionnellement
Du point de vue du programmeur, un ordinateur est un ensemble d’adresses avec des
instructions pour en manipuler le contenu et des indicateurs d’état pour valider les résultats
L’usage de registres de substitution permet des changements de contexte très rapides en
mode d’exception
Selon le standard d’appel ARM, on ne peut pas utiliser les registres R4 à R12 dans la fonction
appelée
Le deuxième argument d’une instruction ARM peut être modifié au préalable
Le bus SPI demande moins de lignes que le bus I2C
Les bus parallèles sont progressivement remplacés par des bus sériels à canaux multiples
dans les cartes-mères
2) Remplir les espaces blancs ou encercler la meilleure réponse dans ce qui suit :
a) Le jeu d’instruction Thumb utilise des codes d’instruction de 16-bit / 32-bit / 16- et 32-bit
b) Le bus SPI permet/ne permet pas le contrôle de flux une fois la communication avec
l’esclave initiée
c) Les transferts dans un bus I2C sont asynchrones / synchrones et utilisent des lignes de
sélection dédiées /des adresses enfouies dans les trames.
d) Le vecteur du RESET et l’affectation initiale du pointeur de piles sont mis dans la section
.text / .data / .bss de la mémoire.
Assembly, C, and the ABI.
3) Donner le code machine en hexadécimal qui correspond à l’instruction add r9,r9,r11 [
Machine Code: _____________________________
4) Toutes les instructions suivantes contiennent des erreurs . Ajouter un commentaire après
chaque instruction pour décrire sommairement l’erreur.
1.
MOV
R0,Temp
2.
MOV
R4,#513
3.
MUL
R0,R0,R0
4.
ADD
R0,R0,1
5.
LDR
LR,R4
6.
SBT
R3,R5,R1
7.
ADDGS R0,R0,R6
8.
AND
R5,R6
5) Donner le contenu de R0 et l’état des sémaphores après l’exécution de chaque instruction.
Mettre ? Pour les valeurs indécidables.
Instruction
MVNS R0,#0
ADDS R0,R0,R0
ADC R0,R0,#0
MOVS R0,#3,2
ADCS R0,R0,R0,ASR #1
N
?
Z
?
V
?
C
?
R0 (in binary)
????????????????
____
6) Supposer que l’on a r3=0xaabbccdd et r1=0x00001000, et tous les autres registres et
locations en mémoire sont initialisés à 0. Commenter le code qui suit et donner les contenus
des registres r1, r3, et r5 après son exécution.
STR
LDRB
ORR
STRH
LDR
R3,
R5,
R5,
R3,
R3,
[R1, #1]
[R1], #2
R5, #0x0f
[R1, #-4]!
[r1]
r1 = _____________________________
r3 = _____________________________
r5 = _____________________________
7) Écrire le pseudo-code suivant en assembleur ARM, en utilisant aussi peu d’instruction que
possible .
If (R0 est impair) Then R1 := R1+R0
Else R1 := R1-R0
8) Considérer le programme suivant :. [10]
/** Print an int.*/
void printint(int a) { printf("%d\n", a); }
/** Sum the first n elements of array a */
int add(int a[], int n) {
int i, sum=0;
for (i =
0; i < n; i++)
sum+=a[i];
printint(sum);
return(sum);
}
/** Test program. Should print out 10 */
main () {
int x[] = {1, 2, 3, 4, 5};
add(x, 4);
}
Récrire la fonction add en langage assembleur ARM, en utilisant les conventions d’usage pour
l’appelant et l’appelé.
9) Le code c suivant fait l’approximation de la racine carrée d’un nombre entier entre 0 et 2311. La fonction retourne la partie entière du résultat désiré. Réécrire le code en assembleur
ARM et écrire une fonction main qui l’appelle avec 100 comme argument.
/** Approximation de la racine carrée d’un nombre entier par la
méthode de bisection. La valeur de retour diffère de de la vraie valeur
par moins que 1 */
unsigned int sqrt(unsigned int x) {
unsigned int a=0;
unsigned int b=2^15;
unsigned int done=0;
int c_old;
int c = -1;
do {
c_old = c;
c = (a+b)/2;
if (c*c == x) {
done = 1;
} else if (c*c < x) {
a = c;
} else {
b = c;
}
} while ((!done) && (c != c_old));
return c;
}
Adressage mémoire
a) Supposer que l’on a un registre de périphérique REG_FOO dont l’adresse est spécifiée par
une directive #define dans un programme en c. Modifier la fonction main u programme
en c qui suit pour ajouter 7 au contenu de REG_FOO. [10]
#include <stdio.h>
#include <inttypes.h>
#define REG_FOO 0x40000140
main () {
// code requis
}
printf(“0x%x\n”, *reg); // Prints out new value
Téléchargement