La mayor parte del contenido de esta respuesta vino originalmente de esta respuesta (escrita antes de que esa otra pregunta se marcara como duplicada). Así que discuto el uso de valores de 8 bits (aunque esta pregunta se refería a valores de 32 bits), pero está bien porque los valores de 8 bits son más simples de entender conceptualmente, y los mismos conceptos se aplican a valores más grandes como la aritmética de 32 bits.
Cuando agrega dos números de 8 bits, el número más grande que puede obtener (0xFF + 0xFF = 1FE). De hecho, si multiplica dos números que son de 8 bits, el número más grande que puede obtener (0xFF * 0xFF = 0xFE01) sigue siendo 16 bits, dos veces de 8 bits.
Ahora, puede suponer que un procesador de x bits solo puede realizar un seguimiento de los bits de x. (Por ejemplo, un procesador de 8 bits solo puede realizar un seguimiento de 8 bits). Eso no es exacto. El procesador de 8 bits recibe datos en fragmentos de 8 bits. (Estos "fragmentos" generalmente tienen un término formal: una "palabra". En un procesador de 8 bits, se usan palabras de 8 bits. En un procesador de 64 bits, se pueden usar palabras de 64 bits).
Entonces, cuando le da a la computadora 3 bytes:
Byte n. ° 1: la instrucción MUL
Byte n. ° 2: los bytes de orden superior (por ejemplo, 0xA5)
Byte n. ° 3: los bytes de orden inferior (por ejemplo, 0xCB)
La computadora puede generar un resultado que Es más de 8 bits. La CPU puede generar resultados como este:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Ahora, permíteme interpretar eso para ti:
0x solo significa que los siguientes dígitos son hexadecimales.
Discutiré los "40" con más detalle momentáneamente.
82 es parte del registro "A", que es una serie de 8 bits.
xx y xx son parte de otros dos registros, denominados el registro "B" y el registro "C". La razón por la que no llené esos bits con ceros o unos es que una instrucción "ADD" (enviada a la CPU) puede hacer que esos bits no cambien por la instrucción (mientras que la mayoría de los otros bits que uso en este ejemplo pueden se alteran, excepto algunos de los bits de la bandera).
D7 cabría en más bits, llamado el registro "D".
Un registro es solo una pieza de memoria. Los registros están integrados en las CPU, por lo que la CPU puede acceder a los registros sin necesidad de interactuar con la memoria en una memoria RAM.
Entonces el resultado matemático de 0xA5 por 0xCB es 0x82D7.
Ahora, ¿por qué los bits se dividieron en los registros A y D en lugar de los registros A y B, o los registros C y D? Bueno, una vez más, este es un escenario de muestra que estoy usando, destinado a ser bastante similar en concepto a un lenguaje ensamblador real (Intel x86 de 16 bits, como lo usan Intel 8080 y 8088 y muchas CPU más nuevas). Puede haber algunas reglas comunes, como el registro "C" que generalmente se usa como índice para operaciones de conteo (típico para bucles), y el registro "B" que se usa para realizar un seguimiento de las compensaciones que ayudan a especificar ubicaciones de memoria. Entonces, "A" y "D" pueden ser más comunes para algunas de las funciones aritméticas comunes.
Cada instrucción de CPU debe tener alguna documentación, utilizada por personas que programan en ensamblador. Esa documentación debe especificar qué registros son utilizados por cada instrucción. (Por lo tanto, la elección sobre qué registros usar a menudo la especifican los diseñadores de la CPU, no los programadores de lenguaje ensamblador. Sin embargo, puede haber cierta flexibilidad).
Ahora, volviendo al "40" en el ejemplo anterior: es una serie de bits, a menudo llamado "registro de banderas". Cada bit en el registro de banderas tiene un nombre. Por ejemplo, hay un bit de "desbordamiento" que la CPU puede establecer si el resultado es mayor que el espacio que puede almacenar un byte de los resultados. (El bit de "desbordamiento" a menudo se puede denominar con el nombre abreviado de "OF". Eso es una o mayúscula, no un cero). El software puede verificar el valor de esta bandera y notar el "problema". El trabajo con este bit a menudo se maneja de forma invisible por los lenguajes de nivel superior, por lo que los programadores principiantes a menudo no aprenden cómo interactuar con los indicadores de la CPU. Sin embargo, los programadores de ensamblados pueden acceder comúnmente a algunos de estos indicadores de una manera muy similar a otras variables.
Por ejemplo, puede tener múltiples instrucciones ADD. Una instrucción ADD podría almacenar 16 bits de resultados en el registro A y el registro D, mientras que otra instrucción podría almacenar los 8 bits bajos en el registro A, ignorar el registro D y especificar el bit de desbordamiento. Luego, más tarde (después de almacenar los resultados del registro A en la RAM principal), podría usar otra instrucción ADD que almacene solo los 8 bits altos en un registro (posiblemente el registro A). Si necesita usar un indicador de desbordamiento dependerá de la instrucción de multiplicación que use.
(También suele haber un indicador de "subdesbordamiento", en caso de que reste demasiado para que quepa en el resultado deseado).
Solo para mostrarle lo complicadas que se pusieron las cosas:
el Intel 4004 era una CPU de 4 bits
El Intel 8008 era una CPU de 8 bits. Tenía registros de 8 bits llamados A, B, C y D.
El Intel 8086 era una CPU de 16 bits. Tenía registros de 16 bits llamados AX, BX, CX y DX.
El Intel 80386 era una CPU de 32 bits. Tenía registros de 32 bits llamados EAX, EBX, ECX y EDX.
Las CPU Intel x64 tienen registros de 64 bits denominados RAX, RBX, RCX y RDX. Los chips x64 pueden ejecutar código de 16 bits (en algunos modos de funcionamiento) y pueden interpretar instrucciones de 16 bits. Al hacerlo, los bits que conforman el registro AX son la mitad de los bits que conforman el registro EAX, que son la mitad de los bits que conforman el registro RAX. Entonces, cada vez que cambie el valor de AX, también está cambiando EAX y RAX, porque esos bits utilizados por AX son parte de los bits utilizados por RAX. (Si cambia EAX por un valor que es un múltiplo de 65,536, entonces los 16 bits bajos no cambian para que AX no cambie. Si cambia EAX por un valor que no es un múltiplo de 65,536, eso también afectaría a AX .)
Hay más banderas y registros que solo los que he mencionado. Simplemente elegí algunos de uso común para proporcionar un ejemplo conceptual simple.
Ahora, si está en una CPU de 8 bits, cuando escribe en la memoria, puede encontrar algunas restricciones sobre la posibilidad de referirse a una dirección de 8 bits, no a una dirección de 4 bits o 16 bits. Los detalles variarán según la CPU, pero si tiene tales restricciones, entonces la CPU puede estar tratando con palabras de 8 bits, por lo que la CPU se conoce comúnmente como una "CPU de 8 bits".