En última instancia, las operaciones muy básicas (que incluyen +) se implementan realmente en hardware . Su CPU tiene un circuito que puede tomar dos números (pasados por un montón de cables), moverlos adecuadamente y escupir su suma (distribuidos por un montón de cables). (Sí, no soy una persona de arquitectura informática).
Ahora, si haces algo como a + b
, en realidad hay algunos pasos para llegar al hardware. Lo primero es averiguar de dónde vienen a y b, lo más probable es que pasen de alguna otra parte del programa. Cuando el compilador compila esa parte del programa, las variables ayb se asignarán a los registros . Los registros son “ranuras” en la CPU que pueden contener un solo número; solo tiene un conjunto limitado de estos y debe usarlos para realizar cualquier operación. Si desea realizar una instrucción de suma, los dos números deben estar en un registro y debe colocar el resultado en otro registro.
Entonces, digamos que tenemos registros para a y b. También necesitamos un registro para poner el resultado. Supongamos que estos registros son $ a0 $ a1 y $ v0. Los registros que comienzan con $ a representan argumentos y los registros que comienzan con $ v se utilizan para obtener resultados. El compilador emitiría un ensamblaje (MIPS, en este caso [1]) que indica a la computadora que agregue $ a0 a $ a1 y ponga el resultado en $ v0:
- ¿Cuáles son algunos métodos de diagnóstico utilizados en un algoritmo de agrupamiento?
- ¿Cuáles serían las mejores entradas para un algoritmo de red neuronal que intenta predecir el mercado de valores?
- ¿Cómo se diseñaría una estructura de datos para soportar las siguientes operaciones en tiempo logarítmico: insert, deleteMin, deleteMax findMin, findMax?
- ¿Alguien ha trabajado en un algoritmo para predecir la corrupción de los funcionarios del gobierno público utilizando la minería de datos y el análisis predictivo?
- El año pasado, logré resolver dos problemas de ACM ICPC en las regiones. Ya que falta solo un mes para la competencia de este año, ¿puedo resolver uno o dos más este año si entreno duro hoy o no hay ninguna posibilidad?
agregue $ v0, $ a0, $ a1
Esta instrucción representa una sola directiva para la CPU, que simplemente le dice que haga esa única adición. En última instancia, todo su programa se verá como una larga cadena de pequeñas instrucciones como esta, todo haciendo cosas muy fundamentales como la adición o la búsqueda de memoria.
Una vez que tenga esta instrucción, debe convertirla en una forma binaria que la CPU pueda entender. Afortunadamente, hay una forma muy directa de traducir de ensamblado a binario: cada instrucción tiene un número y cada registro tiene un número, y simplemente los pega en una cadena binaria larga. Un truco especial en MIPS es que un montón de instrucciones como add y sub tienen el mismo número: 000000. Luego se diferencian por una constante adicional pegada al final de la expresión, después de los registros. Para agregar, este código adicional es 100000. Hasta ahora, tenemos una cadena binaria que se ve así:
000000 $ v0 $ a0 $ a1 00000 100000
Aquí $ v0 $ a0 y $ a1 necesitan ser reemplazados por los números que codifican los registros. No recuerdo para qué sirve el 00000 extra, pero no lo usa la instrucción add para que podamos ignorarlo: P. Los números de los registros son, respectivamente: 00010, 00100 y 00101. Entonces, al final, toda la instrucción se traduce en un solo número de 32 bits:
00000000010001000010100000100000
Entonces, en última instancia, su a + b
se traducirá primero para add $v0, $a0, $a1
y luego a 00000000010001000010100000100000
. La CPU tiene hardware que sabe cómo leer las instrucciones en este formato y cómo agregar en los registros.
[1]: Estoy usando MIPS porque voy a Berkeley y aquí aparentemente creemos que CISC (y por lo tanto x86) es literalmente el demonio.