Bonjour, aujourd’hui je viens poser une question car elle m’énerve depuis quelques temps. Comme vous le savez en assembleur il existe plusieurs registres mais à quoi sert ils ? Par exemple pourquoi tel registre est utiliser pour les syscall etc…
Les registres qui ont un rôle précis, c’est seulement en assembleur x86 la plupart du temps.
Tu as pleins d’assembleur qui sont assez orthogonal à côté. A part ca que je ne peux pas répondre pour x86, le C est un langage qui se compile bien quand il y a beaucoup de registres.
En fait, ce n’est pas l’assembleur en soi qui a des registre mais le processeur. Le nombre, les tailles, les noms et les comportements des registres dépendent de la famille du processeur. C’est donc difficile de donner une explication “générale” des registres qui est vraie pour tous les modèles.
Alors cela varie d’une architecture de processeur à l’autre, il faudrait que tu nous dises avec quelle architecture tu travailles pour qu’on puisse te donner plus de détails.
D’une manière générale, les registres servent à contenir les données avec lesquelles le processeur doit travailler immédiatement. Il y a donc des registres quasi-obligatoires comme le registre rip (64 bits) qui contient l’adresse de la prochaine instruction à exécuter, rbp et rsp qui permettent de manipuler la pile et d’imbriquer les appels de fonctions en assembleur. Ensuite il y a généralement un ou plusieurs registres flag pour stocker le résultat de la dernière instruction exécutée, par exemple si la dernière addition a générée une retenue, si la dernière comparaison a échouée, etc. Pour finir il reste des registres d’utilisation générale laissés libres au programmeur.
Tu peux trouver une liste des registres pour x86_64 ici (pdf).
Faut aussi comprendre que l’utilisation concrète des registres « génériques » est figée par l’usage, que ce soit celui dicté par le système d’exploitation (dans le cas des syscalls, il fallait bien faire un choix) ou même dans le cas des conventions d’appels de fonction (utilisation de registres plutôt que de la pile).
C’est différents des registres plus spécifiques, qui eux ont un rôle assigné par le matériel.
Il n’existe pas plusieurs registres en "assembleur".
Il existe plusieurs registres sur des architectures matérielles (voir les réponses ci-dessus).
Un registre est une mémoire à taille très réduite mais très rapide (puisque présente au sein-même de ton processeur, contrairement à la mémoire vive où il y a besoin d’effectuer plusieurs micro-opérations pour y accéder).
Quand tu programmes en langage d’assemblage (et non pas en assembleur, qui est le terme utilisé pour désigner le programme d’assemblage de ton code source en binaire), tu vas utiliser certains registres pour effectuer des opérations. Il y a d’ailleurs fort à parier que tu aies davantage besoin des General Purpose Register (abrégé en GPR), tel que eax, ebx etc. sur une architecture Intel x86, que des registres spécifiques qui ont un rôle assigné par le matériel comme le souligne lthms.
Il s’agit d’une convention fixée par les systèmes d’exploitation, nommée ABI pour Application Binary Interface. Si tu développes ton système d’exploitation, tu as tout à fait loisir à choisir quel registre aura telle utilité.
Par convention, sur systèmes Linux x64, à titre d’exemple, il me semble que c’est le registre rax qui contient la valeur de retour d’une fonction s’il s’agit d’autre chose que d’un nombre flottant (auquel cas je ne me rappelle plus du registre en question… Tout ça est si loin…).
C’est assez simple : il te suffit de te rendre sur le site du constructeur du CPU, de récupérer la doc technique (par exemple là c’est celle d’Intel), et ce sont eux qui t’expliquent leur utilité, etc.
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte