Aller au contenu

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;
}