La mayor parte del contenido de esta respuesta provino originalmente de esta respuesta (escrito antes de que la otra pregunta fuera marcada como un duplicado). Así que discuto el uso de valores de 8 bits (aunque esta pregunta pregunta preguntaba sobre valores de 32 bits), pero eso está bien porque los valores de 8 bits son más sencillos de entender conceptualmente, y los mismos conceptos se aplican a valores más grandes como la aritmética de 32 bits.
Cuando sumas dos números que son de 8 bits, el número más grande que puedes obtener (0xFF + 0xFF = 1FE). De hecho, si multiplicas dos números que son de 8 bits, el mayor número que puedes obtener (0xFF * 0xFF = 0xFE01) sigue siendo 16 bits, dos veces de 8 bits.
Ahora, puedes estar asumiendo que un procesador de x-bits sólo puede llevar la cuenta de los x-bits. (Por ejemplo, un procesador de 8 bits sólo puede llevar la cuenta de 8 bits.) Eso no es exacto. El procesador de 8 bits recibe los datos en trozos de 8 bits. (Estos “trozos” suelen tener un término formal: una “palabra”. En un procesador de 8 bits, se utilizan palabras de 8 bits. En un procesador de 64 bits, se pueden utilizar palabras de 64 bits)
Por lo tanto, cuando le da a la computadora 3 bytes:
Byte #1: La instrucción MUL
Byte #2: los bytes de orden alto (por ejemplo, 0xA5)
Byte #3: los bytes de orden bajo (por ejemplo, 0xCB)
La computadora puede generar un resultado de más de 8 bits. La CPU puede generar resultados como este:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
también conocido como:
0x4082xxxxD7
Ahora, déjeme interpretarlo para usted:
0x sólo significa que los siguientes dígitos son hexadecimales.
Discutiré el “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, llamados 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 sean modificados por la instrucción (mientras que la mayoría de los otros bits que utilizo en este ejemplo pueden ser alterados, excepto algunos de los bits de bandera).
D7 cabría en más bits, llamados el registro “D”.
Un registro es sólo un pedazo de memoria. Los registros están incorporados en las CPU, por lo que la CPU puede acceder a los registros sin necesidad de interactuar con la memoria de una memoria RAM.
Así que 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 16-bit, como el usado por el Intel 8080 y 8088 y muchas CPUs más nuevas). Podría haber algunas reglas comunes, como el registro “C” que se utiliza típicamente como índice para las operaciones de conteo (típico para los bucles), y el registro “B” que se utiliza para realizar un seguimiento de las compensaciones que ayudan a especificar las ubicaciones de la memoria. Por lo tanto, “A” y “D” pueden ser más comunes para algunas de las funciones aritméticas comunes.
Cada instrucción de la CPU debe tener alguna documentación, usada por la gente que programa en ensamblador. Esa documentación debería especificar qué registros son usados por cada instrucción. (Así que la elección sobre qué registros usar es a menudo especificada por los diseñadores de la CPU, no por los programadores del lenguaje ensamblador. Aunque, puede haber cierta flexibilidad)
Ahora, volviendo al “40” del ejemplo anterior: es una serie de bits, a menudo llamados “registro de banderas”. Cada bit del registro de banderas tiene un nombre. Por ejemplo, hay un bit de “desbordamiento” que la CPU puede establecer si el resultado es más grande que el espacio que puede almacenar un byte de los resultados. (El bit “desbordamiento” a menudo puede ser referido por el nombre abreviado de “OF”. Es una “o” mayúscula, no un cero). El software puede comprobar el valor de esta bandera y notar el “problema”. El trabajo con este bit es a menudo manejado de forma invisible por lenguajes de alto nivel, por lo que los programadores principiantes a menudo no aprenden a interactuar con las banderas de la CPU. Sin embargo, los programadores en ensamblador pueden acceder comúnmente a algunas de estas banderas de una manera muy similar a otras variables.
Por ejemplo, puede que tengas múltiples instrucciones ADD. Una instrucción ADD puede almacenar 16 bits de resultados en el registro A y en el registro D, mientras que otra instrucción puede 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 utilizar otra instrucción ADD que almacene sólo los 8 bits altos en un registro (posiblemente el registro A.) La necesidad de utilizar un indicador de desbordamiento puede depender de la instrucción de multiplicación que utilice.
(También suele haber una bandera de “underflow”, en caso de que restes demasiado para que quepa el resultado deseado)
Sólo para mostrarte 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 CPUs Intel x64 tienen registros de 64 bits llamados RAX, RBX, RCX y RDX. Los chips x64 pueden ejecutar código de 16 bits (en algunos modos operativos), y pueden interpretar instrucciones de 16 bits. Al hacerlo, los bits que componen el registro AX son la mitad de los bits que componen el registro EAX, que son la mitad de los bits que componen el registro RAX. Así que cada vez que cambias el valor de AX, también estás cambiando EAX y RAX, porque esos bits usados por AX son parte de los bits usados por RAX. (Si cambias EAX por un valor que es un múltiplo de 65.536, entonces los 16 bits bajos no cambian, así que AX no cambiaría. Si cambias EAX por un valor que no es un múltiplo de 65.536, entonces eso también afectaría a AX)
Hay más banderas y registros que los que he mencionado. Simplemente elegí algunos de los más utilizados para dar un ejemplo conceptual simple.
Ahora, si estás en una CPU de 8 bits, cuando escribes en la memoria, puedes encontrar algunas restricciones acerca de poder referirte a una dirección de 8 bits, no a una dirección de 4 bits o 16 bits. Los detalles variarán en función de la CPU, pero si tiene tales restricciones, entonces la CPU puede estar tratando con palabras de 8 bits, por lo que la CPU se denomina más comúnmente “CPU de 8 bits”.