Afficher le contenu du registre

Résolu/Fermé
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013 - Modifié par BV91 le 12/04/2013 à 14:16
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013 - 20 avril 2013 à 18:30
Bonjour,

Je voudrais afficher le contenu du registre à l'écran sous la forme de 4 chiffres.
Mes connaissances en C ayant pris de l'âge, j'ai écrit ces lignes-là :

#include <stdio.h> 
#include <stdlib.h> 

int ShowReg() // Déclarer la fonction ShowReg 
{ 
        // <--- manque une ligne 
 int registre = 0; 
 printf("Contenu du registre %d", registre); 
       
  return registre; 
}


Il me manque une ligne pour récupérer le contenu du registre, quelqu'un aurait uneidée sur comment faire ?

Merci par avance !

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 12/04/2013 à 13:54
Salut BV91,

Si tu parles de registres du microprocesseur, le C n'est, normalement, pas fait pour cela.

De plus, ta question est très incomplète, puisque tu ne mentionnes pas de quel processeur tu parles, ni de quel registre.

A titre d'information, voilà un tableau des registres sur un processeur x86 :

https://en.wikipedia.org/wiki/File:Table_of_x86_Registers.png

Outre le processeur et le registre concerné, explique pourquoi tu veux faire cela, car cela peut nous aider à te donner une meilleure réponse.

Explique aussi ce que tu veux dire par "sous la forme de 4 chiffres", car ton code ne fait pas cela, de toutes façons.

Donne un exemple :-)


Dal
0
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
Modifié par BV91 le 12/04/2013 à 14:13
Bonjour [Dal] et merci de ta réponse,

Oui, il s'agit du registre du microprocesseur. Pour le langage, c'est un contrainte qui vient d'en-haut ;)

Mon programme est censé modéliser un registre capable de mémoriser puis d'afficher 4 digits = 4 chiffres décimaux.
Et le soft devrait tourner éventuellement sur un micro-contrôleur ou un DSP...

J'espère que j'ai été claire ! :)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 12/04/2013 à 15:42
C'est encore un peu le brouillard :-)

La façon dont tu accèdes à un registre donné, ou dont tu peux afficher quelque chose sur un affichage éventuellement présent va dépendre du matériel.

Sur un micro-controleur Arduino, les registres sont mappés sur des variables directement manipulables dans le programme écrit en langage arduino (proche du C), et portent des noms précis.

Pour stocker des valeurs de 0000 à 9999 sur le matériel, il te faut un registre sur 16 bits, ou deux registres de 8 bits, que tu puisses utiliser à des fins de stockage.

Si tu ne fais que "modéliser", sans savoir pour quel matériel, je ne vois pas trop l'intérêt de ce que tu dois faire, car tu vas devoir simuler le stockage d'une valeur sur un registre et simuler l'envoi de chiffres sur un affichage (à la rigueur, fais des fonctions à compléter une fois le matériel déterminé).

Quant à prendre un entier entre 0 et 9999 et retourner une chaîne de 4 caractères au maximum, avec zéros devant si nécessaire, un sprintf(chaine, "%04d", contenu_reg); suffira.


Dal
0
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
Modifié par BV91 le 15/04/2013 à 14:16
Merci encore de tes explications.
Ce qui m'embête un peu c'est l'espace mémoire du registre. Une variable de type "int" me semble gourmande en matière d'espace mémoire. Y aurait-il un autre type natif de données qui pourrait mieux accueillir mon registre ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 avril 2013 à 16:48
char sera insuffisant car tu n'auras que 8 bits (unsigned char permet de stocker des valeurs de 0 à 255).

Dans l'ordre des types de données, le C prévoit short int, puis int.

La taille effective occupée par ces types de données dépendra du matériel utilisé. Sauf erreur, tout ce que l'on peut dire, d'après le standard, c'est qu'il seront au moins sur 16 bits (permettant de stocker des valeurs de 0 à 65535), et qu'un short int sera inférieur ou égal en taille à un int.

Il y a des chances que l'implémentation du C à utiliser pour la programmation de ces matériels retienne une taille identique, mais comme tu le vois, tu "consommes" déjà 2 octets au moins.

Si tu es à un octet près (!), tu peux toujours faire de la manipulation de bits pour sauver quelques bits de plus, mais pour stocker 9999 il te faut de toutes façons 14 bits, alors l'économie par rapport à 16 bits ne vaut certainement pas le mal que tu te donnerais à programmer cela en C.

Enfin, dans la mesure où ton entier ne sera pas signé, le type adéquat sera aussi "unsigned short int" ou "unsigned int".


Dal
0
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
Modifié par BV91 le 20/04/2013 à 18:50
Merci pour les explications ! J'avoue avoir du mal avec la modélisation !!! :-)

Comme j'aurai besoin de 2 octets : 4 groupes de 4 bits, le 1er groupe de 4 bits sera réservé aux milliers, le 2ème groupe sera réservé aux centaines, 3ème groupe sera réservé aux dizaines et le 4ème sera réservé pour les unités.

J'ai créé donc un nouveau type "registre" de type unsigned short. Je pense que ça fera l'affaire :
typedef unsigned short Reg;


Et la fonction ShowReg sera donc la suivante :
Reg ShowReg(Reg reg)   
{  
  printf("%d%d%d%d\n", (reg & 0xF000) >> 12, (reg & 0x0F00) >> 8, (reg & 0x00F0) >> 4, reg & 0xF);  
  return reg;  
}
0