Pregunta

Estoy aprendiendo aritmética computacional. El uso del libro I (Patterson y Hennessey) enumera el siguiente pregunta.

  

Escribir código MIPS para llevar a cabo el doble   sustracción número entero de precisión para   datos de 64 bits. Supongamos que el primer operando   para estar en los registros $ t4 (alta) y   $ T5 (LO), segundo en $ t6 (alta) y   $ T7 (lo).

Mi solución a la respuesta es

sub  $t3, $t5, $t7   # Subtract lo parts of operands. t3 = t5 - t7
sltu $t2, $t5, $t7   # If the lo part of the 1st operand is less than the 2nd,
                     #   it means a borrow must be made from the hi part
add  $t6, $t6, $t2   # Simulate the borrow of the msb-of-low from lsb-of-high
sub  $t2, $t4, $t6   # Subtract the hi's. t2 = t4 - t6

Sin embargo las soluciones autor dado para este problema son las siguientes

Para enteros de precisión doble firmados,

subu $t3, $t5, $t7   
sltu $t2, $t5, $t7  
add  $t6, $t6, $t2
sub  $t2, $t4, $t6

Para enteros sin signo de doble precisión,

subu $t3, $t5, $t7   
sltu $t2, $t5, $t7  
addu $t6, $t6, $t2
subu $t2, $t4, $t6

Mi comprensión de la diferencia en la operación de sub/add y subu/addu es que se desbordan en excepciones se genera en sub/add y no en subu/addu. Tanto sub/add y subu/addu restar / añadir los bits de los operandos y la interpretación de los operandos de ser firmado o marcas sin firmar ninguna diferencia en el resultado al contrario que en las instrucciones slt y sltu.

Pregunta 1
Estoy inferir de las soluciones de autor dado que la detección de desbordamiento se manipula mientras que yo no pensaba lo mismo en mi solución. Estoy en lo cierto? ¿Hay alguna otra cosa que me falta?

Pregunta 2
Suponiendo que mi inferencia anterior es correcto, ¿por qué es la detección de desbordamiento apagado para las soluciones de autor proporcionado en el caso de sustracción de doble precisión sin firmar por el uso de addu y subu?

¿Fue útil?

Solución

En suma y la resta, no hay ninguna diferencia entre operandos con y sin signo, a excepción de la noción de desbordamiento. Un desbordamiento es lo que sucede cuando el valor numérico del resultado no coincide con la interpretación de la secuencia de bits que se obtiene.

Por ejemplo, considere secuencias de 8 bits (MIPS tiene registros de 32 bits, pero 8 bits son más fáciles para mis ejemplos). Supongamos interpretación sin signo: una secuencia de 8 bits representa un valor numérico entre 0 y 255 (ambos inclusive). Si añado 10.010.011 (valor numérico 147) a 01.110.110 (valor numérico 118) entonces consigo 00001001 (valor numérico 9). 9 no es igual a 147 + 118. Me sale ese resultado debido a que el valor matemático es de 265, lo que no puede caber en 8 bits. El resultado de la suma habría requerido 9 bits, pero el noveno bit superior se ha caído.

Ahora, imagine el mismo ejemplo con el firmado interpretación. 10010011 ahora tiene valor numérico -109. 01110110 todavía tiene valor numérico 118, y el resultado obtenido (00001001) tiene un valor 9. La suma matemática de -109 y 118 es 9, por lo que no hay desbordamiento.

Esto significa que la noción de desbordamiento depende de cómo se interprete los valores. La mecánica adición son los mismos para ambas interpretaciones con y sin signo (por las mismas secuencias de entrada de bits, se obtiene la misma secuencia de bits de salida - este es el punto central de la utilización de complemento a dos para los valores negativos firmado), pero difiere manejo de desbordamiento <. / p>

La arquitectura MIPS proporciona medios para desencadenar excepciones en desbordamiento. Conceptualmente, hay tres Las operaciones de adición posible en palabras de 32 bits:

  • una adición que (se trunca resultado) omite silenciosamente desbordamientos
  • una adición que genera una excepción cuando se produce un desbordamiento de firmado (hay un desbordamiento si las secuencias de entrada y salida se interpretan como números con signo)
  • una adición que eleva una excepción cuando se produce un desbordamiento sin signo (hay un desbordamiento si las secuencias Intput y de salida se interpretan como números sin signo)

Los MIPS implementa los dos primeros tipos de adiciones, con, respectivamente, los códigos de operación addu y add. En las documentaciones MIPS, se llaman, respectivamente, sin signo y aritmética firmados . No hay ningún código de operación para elevar excepciones en desbordamientos sin firmar. En la práctica, los compiladores de C utilizan sólo addu, pero podrían utilizar para este tipo de add firmados (esto es permitido por la norma C, pero se romperían una gran cantidad de código existente). Ada compiladores utilizan add porque Ada hace desbordamiento comprobación obligatoria.

Una vez dicho esto ...

Patterson y Hennessey quieren implementar la aritmética con y sin signo en enteros de 64 bits. Para la aritmética sin signo, que quieren sin excepción alguna, por lo tanto, que utilizan addu y subu. Para aritmética firmados, que quieren una excepción que se produzca cuando el resultado matemático no encajaría en un 64 bits de secuencia con la interpretación firmado. Ellos no quieren lanzar una excepción debido a algunos desbordamiento como condición al procesar las mitades espurios bajos de 32 bits. Es por eso que utilizan un subu para las partes bajas.

Su solución es incorrecta, ya que puede provocar una excepción donde no debe. Supongamos que desea restar 2000000000 (dos mil millones) de -2000000000 (menos de dos mil millones). El resultado matemático es 4000000000 (cuatro mil millones). Los dos operandos y el resultado ciertamente encajan en 64 bits (el rango representable es -9223372036854775808-9223372036854775807). Por lo tanto, para la aritmética con signo de 64 bits, no hay desbordamiento: no debe haber ninguna excepción. Sin embargo, en esa situación, su primera sub informará de un desbordamiento. sub que trabaja con valores de 32 bits y firmado 32 bits aritmética. su opeRands serán 01110111001101011001010000000000 y 10001000110010100110110000000000. en cuenta que estos valores tanto de ajuste en 32 bits: La interpretación signo de 32 bits de estos valores son, respectivamente, más y menos de dos mil millones. El resultado de la resta, sin embargo, es de cuatro mil millones, y no se ajusta en 32 bits (como un número con signo). Por lo tanto, su sub genera una excepción.

Como regla general, la detección de desbordamiento se trata de hacer las cosas que dependen de la interpretación de signo, lo cual afecta la manipulación del bit más significativo. Para grandes aritmética de enteros, todas las palabras excepto los más significativos serán tratadas como sin firmar, por lo tanto, addu / subu todas partes. Como primer paso, las cosas son más fáciles de entender si primero se concentran en la aritmética sin signo, sin excepción (a continuación, sólo tiene que utilizar addu y subu, y no add o sub).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top