Te damos la bienvenida a proyecto online, aquí vas a hallar la solucíon a lo que buscas.
Solución:
Cada vez que desee tratar con este tipo de elementos de ALU, ya sea sumar, restar, multiplicar, etc., comience con números de 2 o 3 bits, mucho más fácil de manejar que los números de 32 o 64 bits. Después de 2 o 3 bits, no importa si son 22 o 2200 bits, todo funciona exactamente igual de ahí en adelante. Básicamente, puede hacerlo a mano si desea hacer una tabla de todos los operandos de 3 bits y sus resultados de manera que pueda examinar toda la tabla visualmente, pero una tabla de todos los operandos de 32 bits contra todos los operandos de 32 bits y sus resultados, no se puede hacer eso a mano en un tiempo razonable y no puede examinar toda la mesa visualmente.
Ahora complemento a dos, eso es solo un esquema para representar números positivos y negativos, y no es algo arbitrario, tiene una razón, la razón de la locura es que su lógica de sumador (que es también lo que usa el sustractor, que es el mismo tipo de cosas el multiplicador usa) NO LE IMPORTA LOS NO FIRMADOS O FIRMADOS. No conoce la diferencia. A USTED, el programador le importa en mi mundo de tres bits, el patrón de bits 0b111 podría ser un siete positivo (+7) o podría ser uno negativo. El mismo patrón de bits, aliméntelo a la lógica de adición y sale lo mismo, y la respuesta que sale puedo elegir interpretarla como no firmado o complemento a dos (siempre que interprete los operandos y el resultado como no firmado o todo como complemento a dos). El complemento a dos también tiene la característica de que para números negativos se establece el bit más significativo (msbit), para números positivos es cero. Entonces no es signo más magnitud, pero aún hablamos de que el msbit es el bit de signo, porque excepto por dos números especiales que es lo que nos está diciendo, el signo del número, los otros bits en realidad nos dicen la magnitud que son. simplemente no una magnitud sin firmar como podría tener en signo + notación de magnitud.
Entonces el key Toda esta pregunta es comprender tus límites. Para un número sin signo de 3 bits, nuestro rango es de 0 a 7, de 0b000 a 0b111. para una firma de 3 bits (complemento a dos) interpretación nuestro rango es -4 a +3 (0b100 a 0b011). Por ahora limitándonos a 3 bits si suma 7 + 1, 0b111 + 0b001 = 0b1000
pero solo tenemos un sistema de 3 bits, por lo que es 0b000, 7 + 1 = 8, no podemos representar 8 en nuestro sistema, por lo que es un desbordamiento, porque estamos interpretando los bits como sin signo, miramos el “desbordamiento sin firmar“que también se conoce como bit de acarreo o bandera. Ahora, si tomamos esos mismos bits pero los interpretamos como con signo, entonces 0b111 (-1) + 0b001 (+1) = 0b000 (0). Menos uno más uno es cero. Sin desbordamiento, el “desbordamiento firmado” no está configurado … ¿Cuál es el desbordamiento firmado?
Primero, ¿cuál es el “desbordamiento sin firmar“.
La razón por la que “todo funciona igual” sin importar cuántos bits tengamos en nuestros registros no es diferente a la matemática de la escuela primaria con números de base 10 (decimal). Si sumas 9 + 1 que están ambos en la columna de las unidades, dices 9 + 1 = cero lleva el 1. llevas un uno a la columna de las decenas y luego 1 más 0 más 0 (llenaste dos ceros en la columna de las decenas) es 1 llevar el cero. Tienes un 1 en la columna de las decenas y un cero en la columna de las unidades:
1
09
+01
====
10
¿Qué pasa si declaramos que estamos limitados a solo números en la columna de unidades, no hay espacio para una columna de decenas? Bueno, que el bit de acarreo sea distinto de cero significa que tenemos un desbordamiento, para calcular correctamente el resultado necesitamos otra columna, lo mismo con binary:
111
111
+ 001
=======
1000
7 + 1 = 8, pero no podemos hacer 8 si declaramos un sistema de 3 bits, podemos hacer 7 + 1 = 0 con el bit de acarreo establecido. Aquí es donde la belleza de complemento a dos viene en:
111
111
+ 001
=======
000
si observa la suma de tres bits anterior, no puede saber si es 7 + 1 = 0 con el bit de acarreo establecido o si es -1 + 1 = 0.
Así que para adición sin firmar, como hemos sabido desde la escuela primaria que un traspaso a la siguiente columna de algo distinto de cero significa que hemos desbordado tantos marcadores de posición y necesitamos un marcador de posición más, una columna más, para contener la respuesta real.
Desbordamiento firmado. El tipo de respuesta académica es si el llevar en de la columna msbit no coincide con el realizar. Tomemos algunos ejemplos en nuestro mundo de 3 bits. Así que con complemento a dos estamos limitados de -4 a +3. Entonces, si sumamos -2 + -3 = -5, ¿eso no funcionará correctamente? Para averiguar qué es menos dos, hacemos una inversión y agregamos un 0b010, 0b101 invertido, agregamos un 0b110. Menos tres es 0b011 -> 0b100 -> 0b101
Entonces ahora podemos hacer esto:
abc
100
110
+ 100
======
010
Si miras el número debajo de la b, ese es el “llevar en“a la columna de msbit, el número debajo del 1, es el realizar, estos dos no coinciden, por lo que sabemos que hay un “desbordamiento firmado“.
Probemos 2 + 2 = 4:
abc
010
010
+ 010
======
100
Puedes decir pero eso se ve bien, seguro no firmado lo hace, pero lo estamos haciendo firmado matemáticas aquí, por lo que el resultado es en realidad un -4, no un positivo 4. 2 + 2! = -4. los llevar en que está debajo de la b es un 1, el realizar del msbit es un cero, el llevar en y el realizar no coinciden. Desbordamiento firmado.
Hay un atajo para averiguar el desbordamiento firmado sin tener que mirar el llevar en (o realizar). if ( msbit(opa) == msbit(opb) ) && ( msbit(res) != msbit(opb) )
desbordamiento firmado, de lo contrario no desbordamiento firmado. opa es un operando, opb es el otro y res el resultado.
010
+ 010
======
100
Toma esto +2 + +2 = -4. msbit (opa) y msbit (opb) son iguales, y el resultado msbit no es igual a opb msbit, por lo que este es un desbordamiento firmado. Podrías pensar en ello usando esta tabla:
x ab cr
0 00 00
0 01 01
0 10 01
0 11 10 signed overflow
1 00 01 signed overflow
1 01 10
1 10 10
1 11 11
Esta tabla son todas las combinaciones posibles si llevar en bit, operando a, operando b, realizar y el bit de resultado para una sola columna, gire la cabeza hacia los lados hacia la izquierda para ver que esta x es la llevar en, las columnas ayb son los dos operandos. cr
como un par es el resultado xab
de 011 significa 0 + 1 + 1 = 2 decimal que es 0b10 binario. Entonces, tomando la regla que se nos ha dictado, que si el llevar en y realizar no coinciden que es un desbordamiento firmado. Bueno, los dos casos en los que el elemento de la columna x no coincide con el elemento de la columna c se indican, esos son los casos en los que las entradas ayb coinciden entre sí, pero el bit de resultado es el opuesto de ay b. Entonces, asumiendo que la regla es correcta, este atajo rápido que no requiere saber cuáles son los bits de acarreo, le dirá si hubo un desbordamiento firmado.
Ahora estás leyendo un libro de H&P. Lo que probablemente significa mips o dlx, ni mips ni dlx tratan con carry y banderas firmadas de la forma en que lo hacen la mayoría de los otros procesadores. mips no es el mejor primer conjunto de instrucciones, en mi opinión, principalmente por esa razón, su enfoque no es incorrecto de ninguna manera, pero siendo el bicho raro, pasará una eternidad pensando de manera diferente y teniendo que traducir cuando vaya a la mayoría de los otros procesadores. ¿Dónde, si aprendió las banderas típicas de znvc (bandera cero, bandera negativa, v =desbordamiento firmado, c = llevar o desbordamiento sin firmar), entonces solo tienes que traducir cuando vayas a mips. Normalmente, estos se calculan en cada operación de alu (para los procesadores que no son de tipo mips) verá firmada y desbordamiento sin firmar siendo calculado para sumar y restar. (Estoy acostumbrado a un mips más antiguo, tal vez esta generación de libros y el conjunto de instrucciones actual tengan algo diferente). Llamarlo addu add unsigned justo al comienzo de mips después de aprender todo lo anterior acerca de cómo un circuito sumador no se preocupa por firmado vs no firmado, es un gran problema con mips que realmente te pone en la mentalidad equivocada para entender algo tan simple. Lleva a la creencia de que existe una diferencia entre la suma con signo y la suma sin firmar cuando no la hay. Solo los indicadores de desbordamiento se calculan de manera diferente. Ahora multiplica y divide, definitivamente hay un complemento a dos vs diferencia sin firmar e idealmente necesitas un multiplicar firmado y un multiplicar sin firmar o necesitas lidiar con la limitación.
Recomiendo un simple (dependiendo de qué tan fuerte sea la manipulación de bits y complemento a dos) ejercicio que puedes escribir en algún idioma de alto nivel. Básicamente, tome todas las combinaciones de números sin signo del 0 al 7 sumados al 0 al 7 y guarde el resultado. Imprima tanto en decimal como en binario (tres bits para los operandos, cuatro bits para el resultado) y si el resultado es mayor que 7, imprima también el desbordamiento. Repita esto usando variables con signo usando los números -4 a +3 sumados a -4 a +3. imprime tanto el decimal con un signo +/- como el binario. Si el resultado es menor que -4 o mayor que +3, desbordamiento de impresión. En esas dos tablas, debería poder ver que las reglas anteriores son true. Observando estrictamente el operando y los patrones de bits de resultado para el tamaño permitido (tres bits en este caso), verá que la operación de suma da el mismo resultado, el mismo patrón de bits para un par de entradas dado, independientemente de si esos patrones de bits se consideran sin firmar. o complemento a dos. También puedes verificar que desbordamiento sin firmar es cuando el resultado necesita usar esa cuarta columna, hay un realizar fuera del msbit. Por firmado cuando el llevar en no coincide con el realizar, que ves usando el atajo mirando los msbits de los operandos y result. Aún mejor es que su programa haga esas comparaciones e imprima algo. Entonces, si ve una nota en su tabla que indica que el resultado es mayor que 7 y una nota en su tabla que el bit 3 está configurado en el resultado, entonces verá para la tabla sin firmar que siempre es el caso (limitado a entradas de 0 a 7). Y el mas complicado desbordamiento firmado, es siempre cuando el resultado es menor que -4 y mayor que 3 y cuando los bits superiores del operando coinciden y el bit superior del resultado no coincide con los operandos.
Sé que esto es muy largo y muy elemental. Si me equivoqué por completo aquí, comente y eliminaré o volveré a escribir esta respuesta.
La otra mitad del complemento a dos magia. El hardware no tiene lógica de resta. Una forma de “convertir” a complemento a dos es “invertir y sumar uno”. Si quisiera restar 3 – 2 usando complemento a dos lo que en realidad sucede es que es lo mismo que +3 + (-2) a la derecha, y para pasar de +2 a -2 invertimos y sumamos uno. Mirando nuestra adición a la escuela primaria, ¿notó el agujero en el llevar en en la primera columna?
111H
111
+ 001
=======
1000
Pongo una H arriba de donde está el agujero. Bien que llevar en se agrega un bit a los operandos, ¿verdad? Nuestra lógica de suma no es un sumador de dos entradas, es un sumador de tres entradas, ¿sí? La mayoría de las columnas tienen que sumar tres números de un bit para calcular dos operandos. Si usamos un sumador de tres entradas en la primera columna, ahora tenemos un lugar para … agregar uno. Si quisiera restar 3 – 2 = 3 + (-2) = 3 + (~ 2) + 1 que es:
1
011
+ 101
=====
Antes de comenzar y completarlo es:
1111
011
+ 101
=====
001
3 – 2 = 1.
Lo que hace la lógica es:
si agrega entonces llevar en = 0; el operando b no está invertido, el realizar no está invertido. si resta entonces llevar en = 1; el operando b está invertido, el realizar PODRÍA ESTAR invertido.
La adición anterior muestra un realizar, No mencioné que se trataba de una operación sin firmar 3 – 2 = 1. Usé algunos complemento a dos trucos para realizar una operación sin firmar, porque aquí de nuevo no importa si interpreto los operandos como firmados o sin firmar, se aplican las mismas reglas para si se suman o si se resta. ¿Por qué dije que el realizar PODRÍA estar invertido es que algunos procesadores invierten el realizar y algunos no. Que tiene que ver con operaciones en cascada, tomando, digamos, una lógica de suma de 32 bits y usando la bandera de acarreo y una suma con acarreo o sustracción con instrucción de préstamo creando una suma o resta de 64 bits, o cualquier múltiplo del tamaño del registro base. Supongamos que tiene dos números de 64 bits en un sistema de 32 bits a: b + c: d donde a: b es el número de 64 bits pero se mantiene en los dos registros ayb donde a es la mitad superior y b es el inferior mitad. entonces a: b + c: d = e: f en un sistema de 32 bits sin firmar que tiene un bit de acarreo y suma con acarreo:
add f,b,d
addc e,a,c
El complemento deja su realizar bit del carril de bits más alto en la bandera de acarreo en el registro de estado, el addc
la instrucción es sumar con acarreo toma los operandos a + c y si el bit de acarreo está establecido, agrega uno más. a + c + 1 poniendo el resultado en ey el realizar en la bandera de acarreo, entonces:
add f,b,d
addc e,a,c
addc x,y,z
Es una adición de 96 bits y así sucesivamente. Aquí de nuevo algo muy ajeno a mips ya que no usa banderas como otros procesadores. Donde lo invertido o no invertido entra en juego realizar está en la resta con préstamo para un procesador en particular. Para restar:
si resta entonces llevar en = 1; el operando b está invertido, el realizar PODRÍA ESTAR invertido.
Para restar con pedir prestado, tiene que decir si la bandera de acarreo del registro de estado indica un préstamo, entonces el llevar en es un 0 más el llevar en es un 1, y tienes que obtener el realizar en el registro de estado para indicar el préstamo.
Básicamente, para la resta normal, algunos procesadores invierten el operando b y continúan en la forma de entrada y realizar Al salir, algunos procesadores invierten el operando by llevar en en el camino de entrada pero no invertir realizar a la salida. Luego, cuando desee hacer una rama condicional, debe saber si la bandera de acarreo significa mayor que o menor que (a menudo la sintaxis tendrá una rama si es mayor o una rama si es menor que y, a veces, le indicará cuál es la rama simplificada si es acarrear conjunto o rama si se lleva claro). (Si no “entiendes” lo que acabo de decir, hay otra respuesta igualmente larga que no significará nada mientras estés estudiando mips).
Al final de la post puedes encontrar los comentarios de otros desarrolladores, tú asimismo puedes mostrar el tuyo si lo deseas.