Comment un ordinateur 8 bits ou un "cpu" interprète-t-il les nombres supérieurs à 255? [dupliquer]


-2

Ok, j'ai donc cherché cela, mais je n'arrive pas à trouver quoi que ce soit qui y soit lié.
Ce que je sais, c'est que si le nombre est supérieur à 255, l'ordinateur utilise un nouveau bloc de mémoire de 8 bits ( 1 octet ) pour stocker le grand nombre.

Alors disons que je veux que l'ordinateur ajoute 255 + 7 . Cela me donnerait 262 en base 10 mais en binaire, ce serait:

00 00 <- avant
01 06 <- après
(sous la forme hexadécimale btw)

Comment l'ordinateur décodera-t-il ces 2 octets en format décimal / base 10 si l'ordinateur ne peut pas ajouter 6 et 256, car 255 est le nombre le plus élevé qu'il puisse ajouter. Comment l'ordinateur ferait-il que cette réponse / résultat de 2 octets apparaisse comme 262 à l'écran?


Il ne faut jamais qu'il devienne 262 pour être affiché comme ça. Il doit calculer le premier chiffre, un '2', puis le deuxième chiffre, etc. Chaque chiffre peut être calculé en restant inférieur à 255.
Aganju

Merci! Cela aide vraiment beaucoup! (; mais comment calculer le premier chiffre 2, le second 6 et le dernier 2 pour former 262? Comment calculer ces nombres avec les 2 octets que l’ordinateur stocke en mémoire? Bien sûr, dans binaire parce que les ordinateurs ne peuvent pas comprendre les chiffres de base 10 / décimaux
CosnotraLF

EDIT: Parce que les deux octets sont: 01 et 06, disons donc que l'ordinateur interprète le plus à gauche en 256 et le plus à droite en 6, quand il essaie de l'écrire à l'écran, il ressemble à ceci: .. 2566 qui est pas égal à 262, donc bien sûr, c'est un calcul plus compliqué, mais je veux savoir comment le calcul est effectué afin que je puisse le mettre en œuvre sur un ordinateur 8 bits que je suis en train de faire.
CosnotraLF

Cette conversion est appelée conversion binaire en décimale avec une précision limitée . L'un des exemples est la conversion d'un nombre 16 bits (tout comme votre 0106) en décimal avec seulement 8 bits d'ALU
Martheen Cahya Paulo

Je n'ai pas lu votre numéro entier parce que je suis en train de faire quelque chose en même temps, mais sachez qu'en théorie, vous pouvez compter jusqu'à 9 ou 10 après avoir 10 doigts.
barlop

Réponses:


2

Tout d'abord, voir le commentaire d'Aganju sous la question.

Maintenant, en ce qui concerne la façon dont l’ordinateur peut garder une trace de cela, je peux vous communiquer mes connaissances grâce à la programmation 16 bits. Les concepts sont probablement les mêmes. (Cependant, la réponse exacte pourrait dépendre de la mise en oeuvre. En d’autres termes, les concepteurs de puces pourraient, du moins en théorie, prendre des décisions différentes quant à son fonctionnement.)

Lorsque vous ajoutez deux nombres de 8 bits, le plus grand nombre que vous pouvez obtenir (0xFF + 0xFF = 1FE). En fait, si vous multipliez deux nombres de 8 bits, le plus grand nombre que vous pouvez obtenir (0xFF * 0xFF = 0xFE01) est toujours de 16 bits, deux fois de 8 bits.

Vous pouvez maintenant supposer qu'un processeur 8 bits ne peut garder une trace de 8 bits. Ce n'est pas précis. Le processeur à 8 bits reçoit les données en morceaux de 8 bits. (Ces "morceaux" ont généralement un terme formel: un "mot". Sur un processeur 8 bits, des mots de 8 bits sont utilisés. Sur un processeur 64 bits, des mots de 64 bits peuvent être utilisés.)

Ainsi, lorsque vous attribuez à l'ordinateur trois octets:
Octet n ° 1: l'instruction MUL
Octet n ° 2: les octets de poids fort (par exemple, 0xA5)
Octet n ° 3: les octets de poids faible (par exemple, 0xCB)
L'ordinateur peut générer un résultat est plus de 8 bits. Le processeur peut générer des résultats comme celui-ci:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7 Je vais
maintenant interpréter cela pour vous:
0x signifie simplement que les chiffres suivants sont hexadécimaux.
Je vais discuter du "40" plus en détail dans un instant.
82 fait partie du registre "A", qui est une série de 8 bits.
xx et xx font partie de deux autres registres, nommés le registre "B" et le registre "C".
D7 tiendrait dans plus de bits, appelé le "
Un registre est juste un morceau de mémoire. Les registres sont intégrés aux processeurs, ce qui leur permet d'accéder aux registres sans avoir à interagir avec la mémoire d'une clé RAM.

Donc, le résultat mathématique de 0xA5 fois 0xCB est 0x82D7.

Maintenant, pourquoi les bits ont-ils été divisés en registres A et D au lieu des registres A et B, ou des registres C et D? Encore une fois, c’est un exemple de scénario que j’utilise, dont le concept est assez similaire à un vrai langage Assembly (Intel x86 16 bits, utilisé par les processeurs Intel 8080 et 8088 et de nombreux processeurs plus récents). Il peut y avoir des règles communes, telles que le registre "C" étant généralement utilisé comme index pour les opérations de comptage (typique pour les boucles) et le registre "B" utilisé pour garder une trace des décalages permettant de spécifier des emplacements de mémoire. Ainsi, "A" et "D" peuvent être plus communs pour certaines des fonctions arithmétiques communes.

Chaque instruction de la CPU doit avoir une documentation, utilisée par les personnes programmant dans Assembly. Cette documentation doit spécifier quels registres sont utilisés par chaque instruction. (Le choix des registres à utiliser est donc souvent spécifié par les concepteurs de la CPU, et non par les programmeurs du langage Assembly. Cependant, il peut y avoir une certaine flexibilité.)

Revenons maintenant au "40" dans l'exemple ci-dessus: il s'agit d'une série de bits, souvent appelée "registre des drapeaux". Chaque bit du registre de drapeaux a un nom. Par exemple, il existe un bit de "dépassement de capacité" que le CPU peut définir si le résultat est supérieur à l'espace pouvant stocker un octet des résultats. (Le bit "débordement" peut souvent être désigné par l'abréviation de "OF". C'est un o majuscule, pas un zéro.) Le logiciel peut vérifier la valeur de cet indicateur et remarquer le "problème". L'utilisation de ce bit est souvent gérée de manière invisible par les langages de niveau supérieur. Par conséquent, les programmeurs débutants n'apprennent souvent pas comment interagir avec les indicateurs de la CPU. Toutefois, les programmeurs d'assemblage peuvent généralement accéder à certains de ces indicateurs de manière très similaire à d'autres variables.
Par exemple, vous pouvez avoir plusieurs instructions ADD. Une instruction ADD peut stocker 16 bits de résultats dans le registre A et le registre D, tandis qu'une autre instruction peut stocker uniquement les 8 bits de poids faible dans le registre A, ignorer le registre D et spécifier le bit de dépassement. Puis, plus tard (après avoir stocké les résultats du registre A dans la RAM principale), vous pourrez utiliser une autre instruction ADD qui ne stocke que les 8 bits les plus hauts dans un registre (éventuellement le registre A). dépendez de l’instruction de multiplication que vous utilisez.

(Il existe également couramment un indicateur de "dépassement inférieur", au cas où vous soustrayeriez trop pour correspondre au résultat souhaité.)

Juste pour vous montrer à quel point les choses se sont compliquées:
le processeur Intel 4004 était un processeur 4 bits.
Le processeur Intel 8008 était un processeur 8 bits. Il avait des registres 8 bits nommés A, B, C et D.
Le processeur Intel 8086 était un processeur 16 bits. Il avait des registres 16 bits nommés AX, BX, CX et DX.
Le processeur Intel 80386 était un processeur 32 bits. Il possédait des registres 32 bits nommés EAX, EBX, ECX et EDX.
Les processeurs Intel x64 possèdent des registres 64 bits nommés RAX, RBX, RCX et RDX.
Les puces x64 peuvent exécuter du code 16 bits (dans certains modes de fonctionnement) et interpréter des instructions 16 bits. Ce faisant, les bits qui composent le registre AX sont la moitié des bits qui constituent le registre EAX, qui sont la moitié des bits qui constituent le registre RAX. Ainsi, chaque fois que vous modifiez la valeur de AX, vous modifiez également EAX et RAX, car ces bits utilisés par AX font partie des bits utilisés par RAX.
Il y a plus de drapeaux et de registres que ceux que j'ai mentionnés.
Maintenant, si vous utilisez un processeur 8 bits, lorsque vous écrivez en mémoire, vous pouvez rencontrer certaines restrictions concernant le fait de pouvoir faire référence à une adresse de 8 bits, et non à une adresse de 4 bits ou 16 bits. Les détails varient en fonction de la CPU, mais si vous avez de telles restrictions, la CPU peut traiter des mots de 8 bits, raison pour laquelle la CPU est plus communément appelée "CPU de 8 bits".


Très utile! +10000
CosnotraLF
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.