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".