* -------------------------- TP du module Archi -------------------------
*
* ATTENTION : un outil de détection de plagiat logiciel sera utilisé lors de la correction, vous avez donc tout intérêt à effectuer un travail PERSONNEL
*
* Un mot/registre de NBITS bits (par défaut NBITS=16) est représenté par un tableau d'entiers égaux à 0 ou 1.
* Une ALU est représentée par une structure ALU, avec registre accumulateur et registre d'état.
* Un CPU (très très simplifié) est représenté par une ALU et quelques registres nécessaires pour stocker les résultats intermédiaires.
*
* Certaines fonctions vous sont fournies, d'autres sont à implanter ou à compléter, de préférence dans l'ordre où elles sont indiquées.
* Il vous est fortement conseillé de lire attentivement l'ensemble des commentaires.
*
* Parmi les opérations arithmétiques et logiques, seules 4 opérations de base sont directement fournies par l'ALU, les autres doivent être décrites comme des algorithmes
* travaillant à l'aide des opérateurs de base de l'ALU simplifiée et pouvant utiliser les registres du CPU.
*
* La fonction main() vous permet de tester au fur et à mesure les fonctions que vous implantez.
* allocation d'un mot entier de NBITS bits initialisé à 0
*/
int*word(){
int*tab;
inti;
tab=(int*)malloc(NBITS*sizeof(int));
for(i=0;i<NBITS;i++)tab[i]=0;
// poids faible : tab[0]
// poids fort : tab[NBITS-1]
returntab;
}
/*
* Initialisation du mot (mot de NBITS bits, codant un entier en Cà2) avec une valeur entière.
*/
voidsetValue(int*word,intn){
intn_low=n&0x7FFFFFFF;
// revient à mettre à 0 le bit de poids fort en 32 bits
// on peut alors travailler sur la partie positive du codage de n
// remarque : si n est bien codable en Ca2 sur NBITS, et si n est négatif, on récupère quand même le codage de n sur NBITS en Ca2 en prenant les NBITS de poids faible de n_low
// à compléter
for(inta=0;a<NBITS;++a){
word[a]=0;
}
inti=0;
while(n_low!=0){
word[i]=n_low%2;
n_low/=2;
i+=1;
}
intindice=0;
if(n<0){
for(inti=0;i<NBITS;i++){
if(word[i]==1){
indice=i;
}
}
for(intj=indice+1;j<NBITS;++j){
if(word[j]==1){
word[j]=0;
}elseif(word[j]==0){
word[j]=1;
}
}
}
}
/*
* instanciation d'un mot de NBITS bits initialisé avec la valeur n
*/
int*initWord(intn){
int*tab=word();
setValue(tab,n);
returntab;
}
/*
* Initialisation du mot (mot de NBITS bits) par recopie des bits du mot en paramètre.
*/
voidcopyValue(int*word,int*src){
// à compléter
for(inti=0;i<NBITS;++i){
word[i]=src[i];
}
}
/*
* instanciation d'un mot de NBITS bits initialisé par recopie d'un mot