QROC A23 Architecture des ordinateurs

Enic - épreuve du 13 mai 2002 (Christophe TOMBELLE)
2 heures - documents autorisés

Matériel (5 points)

Un microprocesseur possède un bus d'adresses 16 bits et un bus de données 8 bits.
Le compteur de programme contient la valeur 0000, le registre AX contient la valeur 3A42. Dans la mémoire de programme, on trouve l' instruction suivante :

Adresse         Code machine    Code assembleur
0000            8A263C05        MOV AH,[053C]

Dans la mémoire de données on a les octets suivants :

Adresse Données                 Ascii
0538    73 61 6C 75 74 20 6C 61 salut la

1. Mettre en évidence l'évolution des valeurs sur les bus d'adresses et de données ainsi que l'évolution des signaux de lecture et d'écriture, lors de l'exécution de cette instruction.

 

A0-A15

 

D0-D7

 

RDbarre

 

WRbarre

 

2. Chaque cycle de bus (lecture ou écriture) dure 4 périodes Th de l'horloge du microprocesseur. On suppose que le microprocesseur fonctionne à une fréquence de 18 MHz, calculer le temps d'exécution de cette instruction.

3. Que contient AX après exécution de cette instruction ?.

4. Ce processeur a intrinsèquement les qualités pour fonctionner à 60 MHz. On lui adjoint des mémoires statiques de 80 ns de temps d'accès. Ces mémoires sont-elles capables de tenir le rythme imposé par ce processeur à cette fréquence ? Justifier la réponse.

Logiciel

Dans toute la partie logiciel, on considère la plate-forme Intel 8086 (16 bits). On rappelle les règles de représentation des objets en mémoire : une variable est représentée par un rectangle. La relation entre pointeur et objet pointé est représentée par une flèche. Le contenu d'une variable est représenté à l'intérieur du rectangle. Le nom d'une variable ou son adresse est écrit à côté du rectangle. Les indices d'un tableau sont notés sous (ou à côté de) chaque case du tableau.

Pointeurs du langage C (5 points)

Attention précisez bien à quelle question chaque dessin correspond !

1) dessinez la représentation d'objets en mémoire correspondant à la situation suivante

{
	char v1, *v2;
	v2 = &v1;
}

2) dessinez la représentation d'objets en mémoire correspondant à la situation suivante

{
	int v1[10];
	int *v2;
	v2 = &v1[4];
}

3) dessinez la représentation d'objets en mémoire correspondant à la situation suivante

{
	struct s1 {
		char c1[40];
		int c2;
	};
	struct s1 *v1 = malloc( sizeof( struct s1 ) );
}

4) dessinez la représentation d'objets en mémoire correspondant à la situation suivante

{
	struct s1 {
		char *c1;
		int c2;
	};
	struct s1 *v1 = malloc( sizeof( struct s1 ) );
	v1->c2 = 10;
	v1->c1 = malloc( v1->c2+1 );
}

Adressage (3 points)

1) Ce mode d'adressage utilise une adresse qui ne sera connue qu'au moment de l'exécution.

2) Ce mode d'adressage ne peut pas être utilisé pour un opérande de destination (opérande de gauche)

3) Citez deux registres d'adresse existant sur tous les microprocesseurs.

Structures de contrôle (3 points)

char tab[10];
int trouve, i;
char val;
int main() {
    ...
    scanf( "%c", &val );
    i=0;
    while (i<10)
        if (tab[i]!=val) {
            trouve=i;
            i=10;
        }
        else
            i++;
    ...
}

Implanter en langage d'assemblage les lignes en caractères gras (l'algorithme de recherche).

Passage des arguments (4 points)

La fonction suivante est supposée être un sous-programme NEAR (appel intra-segment). Rien qu'en examinant son en-tête, il est possible de dessiner l'état de la pile qu'elle manipule.

int fonc1( int par1[100], int par2 )
{
    int i;
    ...
    return par2;
}

1. Dessiner le contexte de pile complètement annoté, manipulé par la fonction fonc1. Il n'est pas demandé de traduction en assembleur de l'implantation de la fonction fonc1.

Dans le même programme, on considère la fonction main qui appelle la fonction fonc1.

int tableau[100];
int var1;
int main()
{
    getData( tableau );
    var1 = tableau[0];
    var1 = fonc1( tableau, var1 );
    printf( "Le minimum est %d\n", minValue );
    return 0;
}

2. Imaginer le code généré par un compilateur C pour implanter le comportement de l'instruction var1 = fonc1( tableau, var1 );