EX05 - Assembleur des processeurs ARM
Exercice 1 : Utilisation des registres
Décrivez succinctement le rôle des 4 registres spéciaux (SP, LR, PC et APSR).
Exercice 2 : Développement croisé vs natif
Quelles différences existent-ils entre un développement croisé et un développement natif ?
Exercice 3 : Structure d’un module d’assemblage
Quelles sont les sections principales d’un module en langage assembleur ?
Que contiennent ces sections ?
Quelle est l’utilité de la directive .align
?
Exercice 4 : Fonction assembleur et interface C/C++
Implémentez en assembleur la fonction C “factorial”. Implémentez également le fichier d’en-tête permettant d’appeler la fonction depuis du code C/C++. La récursivité doit impérativement être conservée et le fichier doit être compilable pour la cible des TPs.
unsigned long factorial (unsigned n) {
if (n == 0) {
return 1;
}
return n * factorial (n-1);
}
Exercice 5 : Boucle “for”
Implémentez en assembleur la fonction C ci-dessous.
struct CheckSum {
unsigned cks1;
unsigned cks2;
};
struct CheckSum checksum (const char* msg, unsigned n) {
struct CheckSum cks = {0, 0};
for (unsigned i=0; i<n; i++) {
cks.cks1 += msg[i];
cks.cks2 += msg[i] * (i+1);
}
return cks;
}
Trouvez l’algorithme le plus performant et réalisez-le.
Exercice 6 : Boucle “while”
Implémentez en assembleur la fonction C ci-dessous.
char* strcpy (char* dest, const char* src) {
char* d = dest;
while (*dest++ = *src++);
return d;
}
Exercice 7 : Calcul de parité verticale
Implémentez en assembleur la fonction C ci-dessous.
uint8_t parity (const uint8_t* msg, unsigned n) {
char parity = 0;
while (n>0) {
n--;
parity ^=msg[n];
}
return parity;
}