Nombre maximum d'opcodes pour un microprocesseur


13

entrez la description de l'image ici

Quel est le nombre maximal d'opcodes pour la question, la réponse est l'option c, mais je pense que c'est l'option d, car, chaque adresse spécifie chaque emplacement de mémoire, il y a 16 lignes d'adresse, ce qui signifie 2 ^ 16 adresses, soit 2 ^ 16 emplacements mémoire.

Donc, si chaque emplacement contient un opcode, 2 ^ 16 emplacements au total contiennent 2 ^ 16 opcodes et c'est le nombre maximum d'opcodes, mais la réponse est donnée comme c, qui est 2 ^ 12. Comment est-ce possible?


7
La question est de savoir combien d'opcodes DIFFÉRENTS dans l'ISA, pas combien d'instructions peuvent constituer le plus grand programme possible.
Brian Drummond

5
@BrianDrummond - avec cette interprétation, cependant, la question n'a de sens que si vous émettez des hypothèses sur le fonctionnement de l'ISA qui ne sont pas universelles. Par exemple, le Z80 possède un bus de données à 8 bits, mais quelque part dans la région de 800 différents opcodes valides - car il utilise des octets de préfixe pour étendre et varier les opérations disponibles.
Jules

15
La question telle qu'elle est formulée dans le livre n'a aucun sens. Il n'y a pas de correspondance directe inhérente entre la taille du bus et la taille de l'opcode. La JVM est basée sur un modèle de données 32 bits mais possède des opcodes 8 bits.
chrylis -en grève-

10
Cette question est incohérente à moins que nous ayons beaucoup d'informations au-delà de ce qui est donné dans la question. Nous aurions à faire beaucoup d'hypothèses sur les caractéristiques du processus pour obtenir une réponse - hypothèses qui ne sont pas vraies pour la grande majorité des processeurs du monde réel!
David Schwartz

14
La question est des conneries. Si nécessaire, un opcode d'instruction peut s'étendre sur plusieurs mots de mémoire. Il n'y a pas de limite inhérente.
Hot Licks

Réponses:


31

Toutes les options sont fausses . Le nombre maximal d'opcodes (uniques) qu'un processeur peut exécuter n'est pas limité par la largeur du bus.


Normalement, un processeur 12+ bits est conçu pour avoir une commande par mot de données afin qu'il puisse lire la plupart des instructions en une seule fois. Ainsi, un CPU normal doit être conçu à une limite de 2 ^ 12 opcodes.

Les architectures de CPU existantes qui ont plus de 2 ^ 12 = 4096 opcodes sont très rares simplement parce que l'on n'a presque jamais besoin de beaucoup - trop pour apprendre, trop pour être vraiment utile, trop d'espace gaspillé coûteux en silicium.

Mise à jour : Comme cela a été souligné dans les commentaires, toutes les variations possibles du jeu d'instructions x86 peuvent en fait s'élever à plus de 6000 selon la façon dont vous comptez! C'est plus une exception cependant.

Cependant, pour un processeur 4 bits 2 ^ 4 = 16, les instructions ne sont souvent pas suffisantes, donc beaucoup de ces processeurs en ont plus.

Il peut y avoir plusieurs façons et raisons pour lesquelles un processeur peut incorporer plus d'opcodes que ce qui tient dans le bus de données, notamment:

Instructions de répartition des mots

Un processeur n'a pas besoin de lire une commande en un seul cycle de données - il peut utiliser plusieurs cycles consécutifs. En fait, la plupart des processeurs ne le font pas - bien que ce soit plus couramment utilisé pour les arguments d'instruction plutôt que pour étendre l'espace opcode.

Exemple: intel 4004 n'a que 4 lignes qui sont multiplexées en tant que lignes de données / adresse, mot de données 4 bits, mais plus de 40 opcodes dans des instructions 8 bits.

Préfixes et suffixes

Un processeur (CISC) peut avoir autant de préfixes et de suffixes d'instructions qu'il en a besoin.

Celles-ci sont préfixées à une instruction réelle pour changer ce qu'elle fait - soit un peu, soit complètement.

Cela dépend de votre définition de "l'opcode unique". Si l'on suppose qu'une partie d'une instruction qui n'est pas des données fait partie d'un opcode, leur nombre total comprendrait toutes les variations possibles. Cependant, certains pensent que ces affixes sont des parties distinctes de l'instruction.

Exemple: les processeurs Intel x86 n'ont pas réellement d'opcodes 4M. Cependant, si vous comptez tous les préfixes comme faisant partie d'un opcode, les processeurs modernes permettent des instructions jusqu'à 15 octets - c'est BEAUCOUP d'opcodes possibles. Bien que beaucoup ne feront que la même chose - cela dépend donc de leur définition comme étant "unique".

Les modes

Un processeur peut avoir plusieurs modes de fonctionnement dans lesquels il peut avoir un ensemble complètement différent d'opcodes.

Exemples: intel x86_64 a des modes 32 bits (réel / v86 / protégé) et 64 bits qui ont des opcodes distincts. Les processeurs ARM peuvent avoir des modes ARM 32 bits et pouce 16 bits.

Multiplexage de bits de bus

Les questions indiquent "lignes de données" et "lignes d'adresse", mais le bus de données interne et le bus d'adresse interne peuvent être plus larges que la quantité de lignes de bus réelles.

Les données de bus multiplexées sont envoyées séquentiellement, c'est-à-dire la première moitié, puis la seconde moitié. Le CPU le stocke dans des registres internes de grande taille et fonctionne sur ceux-ci.

Cela est souvent fait pour réduire les coûts et / ou la taille de l'empreinte physique de la puce.

Les exemples incluent Intel 4004, tout ce qui se trouve sur le bus de données LPC et NEC VR4300, le processeur de Nintendo64 qui ne disposait que d'un bus de données de 32 lignes.

Pas de bus parallèle

Dans la continuité du point précédent, un CPU n'a même pas besoin d'exposer un bus parallèle.

Un processeur peut facilement exposer uniquement un bus séquentiel tel que I2C, SPI, etc.

Il n'est probablement pas très rentable de produire un tel processeur dédié, mais de nombreux microcontrôleurs à faible nombre de broches (qui incluent à la fois le processeur et la mémoire) sont conçus de cette façon pour enregistrer ces précieuses broches pour quelque chose de plus utile. Par exemple, les puces atmel ATTINY4 / 5/6/10 n'ont que 6 broches au total, deux pour l'alimentation, une pour la réinitialisation, trois à usage général. Les instructions sont envoyées via une interface propriétaire à 3 lignes de manière séquentielle.

Selon votre définition d'un microcontrôleur, il peut être considéré comme un microprocesseur ou peut être programmé pour agir sur celui-ci (c'est-à-dire simuler un CPU dédié avec un ou plusieurs bus séquentiels).

Cette question indique clairement qu'une sorte de bus de données EST exposée, mais pas qu'il s'agit d'un bus parallèle. En théorie, le bus de données à 12 lignes pourrait consister en une seule ligne de données série et 11 lignes auxiliaires / terre / état , bien que ce ne soit probablement pas une idée très sensée.

Bus d'instruction dédié

En fait, un processeur n'a même pas besoin d'accepter des instructions sur les mêmes lignes de bus que les données.

Cela pourrait facilement être le cas lorsque les ALU étaient des puces discrètes plutôt qu'une partie d'un microprocesseur mais qu'elles ne sont pas économiquement viables la plupart du temps.

Mais rien ne vous empêche d'implémenter un CPU avec des lignes dédiées juste pour les instructions. Un tel processeur peut être utile lorsqu'une seule opération doit être effectuée sur un tableau de données (SIMD).

Étant donné que la largeur du bus d'instructions est complètement arbitraire, le nombre maximal d'opcode est donc possible.


4
Comme point d'intérêt, x86-64 a entre 1000 et 6000 opcodes, selon qui vous demandez ( 1 , 2 , 3 ).
LMS

Je n'ai jamais essayé de les compter, mais avec toutes les variations, cela a du sens.
Jack White

13

Le nombre maximal d'opcodes peut en effet être envisagé de deux manières:

  • Le nombre maximum possible d'opcodes uniques.

Cela peut être collecté à partir de la largeur de l'instruction et non de la largeur du bus de données. Habituellement, un opcode s'insérera dans un seul accès à la mémoire, puis la réponse est 2 ^ 12. Mais un processeur pourrait implémenter un processus de décodage d'opcode multi-cycle pour étendre le nombre d'opcodes possibles au-delà de 2 ^ 12.

  • Le nombre maximal d'instructions (contenant des opcodes) que le processeur peut directement traiter.

Le nombre maximal d'instructions (contenant des opcodes) que le processeur peut directement adresser est limité par la largeur du bus d'adresse (2 ^ 16). Indirectement, le processeur pourrait cependant être capable d'adresser plus de mémoire, par exemple un opcode pourrait faciliter un échange de page ou une opération similaire pour récupérer des instructions d'une autre source.


2
La question n'est pas si ambiguë. S'il devait être interprété comme votre deuxième point, il aurait été formulé comme "le nombre maximum d' instructions pouvant être stockées / adressées / ...". Le mot "opcode" indique assez clairement qu'il s'agit du jeu d'instructions, pas de la plage adressable.
faible confiance perdue dans SE

11
+1 pour avoir mentionné que les op-codes multi-mots sont tout à fait possibles, donc la question n'est pas très bonne.
Spehro Pefhany

2
Les anglophones natifs ont souvent un parti pris qui les rend difficiles à comprendre simplement la signification nue des mots qu'ils utilisent. Lorsque des anglophones internationaux le lisent ou l'entendent, ils peuvent ne pas avoir le deuxième sens (voulu). La même chose s'applique lorsqu'un étudiant apprend une nouvelle expression - si les formulations sont ambiguës, il est facile de se méprendre. Je suppose donc que l'étudiant a appris que chaque instruction contient une partie opcode. Oui, je dirais que c'est vrai. En réalité, le libellé de la question 01 est ambigu.
HKOB

4
@SpehroPefhany Yep, la question est sans aucun doute ambiguë sans autre contexte. Si l'OP a appris que, quelle que soit la longueur de l'instruction, l'opcode sera récupéré lors du premier accès à la mémoire, alors la réponse est (c), sinon, il est sans réponse. Le fait est que le PO a-t-il donné suffisamment de contexte dans sa question EE.SE, ou son ou ses enseignants ont-ils donné quelque chose pour acquis et formulé une question ambiguë?
Lorenzo Donati soutient Monica

1
@SpehroPefhany True :) Mais les Anglais - peut-être à leur légère contrariété - font également partie du monde anglais international ( bbc.com/capital/story/… )
HKOB

4

Vous avez raison d'être dérouté par cette question - elle est très mal écrite.

Cependant, je soupçonne que l' intention de cette question est de déterminer la taille du mot d'instruction pour la machine. Compte tenu des données très incomplètes fournies, cela doit correspondre à la largeur du bus de données ; la largeur du bus d' adresse détermine la taille maximale de la mémoire principale.

En pratique, le champ "opcode" des instructions d'une machine donnée est souvent beaucoup plus petit que l'instruction elle-même, mais l'instruction peut être plus large que le bus de données.

L'ancien Motorola 68008 en est un exemple - c'était une version à prix réduit du 68000 avec un bus de données 8 bits, mais il utilisait les mêmes mots d'instructions 16 bits, dans lesquels généralement 7 bits déterminent l'opcode (le reste identifier les registres source et de destination, ainsi que le mode d'adressage, qui doivent tous être considérés comme des opérandes et non comme des opcodes ). Si vous incluez les bits du mode d'adressage dans l'opcode, comme certains le font, cela fait un champ opcode de 10 bits au total. Les instructions réelles pourraient être sensiblement plus longues dans certains modes d'adressage.


"les autres identifient les registres source et de destination, et le mode d'adressage, qui doivent tous être considérés comme des opérandes, pas des opcode" ... eh bien, c'est un peu une question d'opinion. Pour une architecture RISC, c'est clairement vrai, mais dans de nombreux cas, les architectures CISC sont définies de manière si ponctuelle qu'il est probablement judicieux de compter chaque combinaison comme un opcode séparé. Le Z80 en est un exemple - alors que beaucoup de ses instructions ont une ou deux sélections de registre encodées dans les bits de l'opcode, les modes d'adressage sont entièrement ad hoc et les préfixes modifient l'interprétation de ...
Jules

... à la fois le mode d'adressage et le registre dans de nombreux cas, ce qui rend l'interprétation des registres à partir des champs binaires un peu moins simple. La plupart des documentateurs et des assembleurs semblent travailler sur la compréhension, par conséquent, que chaque combinaison d'instructions et de registres est un opcode séparé, et seules les valeurs immédiates et les valeurs de décalage d'adresse indirectes sont en fait des opérandes. Cette vision du monde est partagée par son prédécesseur, l'Intel 8080, où le format standard du langage d'assemblage avait des registres opérés par une instruction codée dans le cadre du mnémonique, non donné comme arguments.
Jules

Vrai - le Z80 est typique des processeurs microcodés 8 bits de cette façon. Le 6502 avait un mappage d'opcode plus logique qui permettait d'optimiser le circuit de décodage. Mais je parlais spécifiquement de 68K, qui a des champs de mode d'adressage et de registre de destination très distincts dans ses instructions. Après avoir soustrait ceux-ci, le champ opcode peut toujours être plus large que le bus de données du 68008.
Chromatix

1

Edson DeCastro a conçu un ordinateur presque exactement comme ça, le PDP-8, avec 15 adresses et 12 lignes de données.

La réponse à la question affichée est donc 574 codes opérationnels, car le PDP-8 avait 284 codes opérationnels, et Ed n'est qu'à moitié fou.


2
Je ne sais pas pourquoi le downvote - c'est une aussi bonne réponse que n'importe quelle autre, étant donné que la question est essentiellement vide de sens. :)
Jules

Je soupçonne que le downvote est parce que 284 * 2 = 568, pas 574.
Mark
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.