2016-04-25 6 views
1

Je suis nouveau à l'assemblage et ma question est:x86 - Nombre de registres par rapport au nombre de bits réservés

Si une machine a, par exemple, n registres. Combien de bits doivent être réservés dans l'instruction d'assemblage pour adresser chacun des n registres?

Et de combien une division fonctionnelle pourrait-elle réduire les bits nécessaires?

+2

Cela ressemble à des devoirs, surtout la dernière partie. Si vous n'arrivez pas à comprendre, vous avez vraiment besoin d'un morceau de papier et vous vous asseyez pour réfléchir. – DarkDust

+2

Notez que l'ISA x86 n'utilise pas d'instructions de taille fixe. Si vous êtes intéressé par les détails de l'encodage des instructions sur le x86, lisez le [Manuel du développeur de logiciels Intel] (http://www.intel.com/content/www/fr/processors/architectures-software-developer- manuals.html) (la section sur les octets ModR/M pourrait vous intéresser particulièrement). – Michael

+0

@DarkDust Je suis juste en train de suivre un manuel et je me demande comment ils obtiennent le moins de bits nécessaires. – ethane

Répondre

4

Il n'y a pas de réponse universelle à cela. Évidemment, vous aurez besoin de plus de bits assez pour stocker le nombre de registres. Donc si vous avez 12 registres, vous aurez besoin de 4 bits (2^4 == 16).

Mais un jeu d'instructions pourrait traiter certains registres de différentes manières (par exemple, avoir des instructions qui ne concernent implicitement qu'un registre spécifique, voir LOOP pour x86). Ainsi, une CPU peut avoir 9 registres, mais comme on ne peut y accéder qu'avec une instruction spécialisée, il suffit de 3 bits pour adresser les 8 autres. De plus, certaines instructions ne permettent qu'un certain sous-ensemble de registres, réduisant ainsi la quantité de bits nécessaires pour les traiter (par exemple, une instruction ne permet que de fonctionner sur les registres 0-3).

Et pour le rendre encore plus compliqué, register windows rend seulement un sous-ensemble des registres physiques disponibles pour le jeu d'instructions.

+0

'loop' ou' movsb' serait un meilleur exemple. 'rep 'n'est pas une instruction autonome et ne peut s'appliquer qu'à quelques autres insns. Qu'avez-vous voulu dire en disant que certains opcodes ne peuvent traiter que des registres limités? Parlez-vous du mode 64 bits sans préfixe REX? Je ne peux pas penser à un exemple où vous avez un choix limité de registre qui est encodé en moins de bits que la normale. (Autre que les modes d'adressage 16 bits, et que 'esp/rsp' ne peut pas être un registre d'index dans les modes d'adressage 32/64 bits.) –

+0

@PeterCordes: Vous avez raison,' loop' est un bien meilleur exemple. Avoir mis à jour ma réponse. En ce qui concerne les registres limités: ma réponse concerne les conceptions de CPU génériques (donc aussi théoriques), bien que je me souvienne faiblement qu'il y avait des instructions avec de telles limitations dans 8086 et/ou M68000; en essayant de trouver ceux-ci, il semble que j'avais tort. La famille x86 n'utilise pas non plus de fenêtres de registre, BTW. – DarkDust

+1

Vous devriez supprimer les "certains opcodes x86 font ceci", parce que c'est faux. Le reste de votre réponse est bon (et je n'étais pas le downvoter), et il est clair que vous ne parlez pas de x86 dans le reste. Si vous cherchez des exemples, certaines architectures (ARM, IIRC, mais je ne suis pas sûr) ont des instructions qui utilisent deux registres, et la seconde instruction est implicitement le partenaire impair/pair du reg explicite (bascule le bit bas, plutôt que d'ajouter 1). Pour les regs spéciaux: MIPS a 32 registres GP plus HI et LO pour contenir le résultat d'une multiplication complète (32x32b => 64b), bon exemple pour votre 8 + 1. –