La majeure partie du contenu de cette réponse provenait à l'origine de cette réponse (écrite avant que cette autre question ne soit marquée comme un doublon). Je discute donc de l’utilisation de valeurs 8 bits (même si cette question portait sur les valeurs 32 bits), mais c’est acceptable, car les valeurs 8 bits sont plus simples à comprendre conceptuellement et les mêmes concepts s’appliquent aux valeurs plus grandes telles que l’arithmétique 32 bits.
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 x-bit ne peut garder une trace de x-bits. (Par exemple, un processeur 8 bits ne peut garder qu'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 3 octets à l'ordinateur:
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". La raison pour laquelle je n’ai pas rempli ces bits avec des zéros ou des uns est qu’une instruction "ADD" (envoyée à la CPU) peut faire en sorte que ces bits soient inchangés par l’instruction (alors que la plupart des autres bits que j’utilise dans cet exemple être modifié, à l'exception de quelques-uns des bits de drapeau).
D7 pourrait contenir plus de bits, appelé le registre "D".
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 à celui d’un véritable 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" 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: c’est une série de bits, souvent appelée "registre des drapeaux". Chaque bit du registre de drapeaux a un nom. Par exemple, il y a 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. Cependant, 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 simplement stocker les 8 bits inférieurs dans le registre A, ignorer le registre D et spécifier le bit de dépassement. Ensuite, plus tard (après avoir stocké les résultats du registre A dans la RAM principale), vous pourrez utiliser une autre instruction ADD qui stocke uniquement les 8 bits de poids fort dans un registre (éventuellement le registre A). Indiquez si vous devez utiliser un indicateur de dépassement de capacité. 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 tenir dans le 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. (Si vous modifiez EAX avec une valeur multiple de 65 536, les 16 bits inférieurs restent inchangés. AX ne changera donc pas. Si vous modifiez EAX avec une valeur qui n'est pas un multiple de 65 536, cela affectera également AX .)
Il y a plus de drapeaux et de registres que ceux que j'ai mentionnés. J'ai simplement choisi des exemples couramment utilisés pour fournir un exemple conceptuel simple.
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".