2009-04-20 8 views
5

¿Puede alguien explicarme cómo la división en MIX (de TAOCP por Knuth) funciona de byte a byte?¿Cómo funciona la división en MIX?

rA = |-| . . . .0| 

rX = |+|1235|0|3|1| 

La ubicación de la memoria 1000 contiene |-|0|0|0|2|0|.

Al ejecutar la operación

DIV 1000 

los registros se convierten en

rA = |+|0|617|?|?| 

rX = |-|0|0|0|?|1| 

Ahora entiendo las señales de rA y rX, pero en qué orden son los bytes de rAX llenos y que las divisiones son ¿hecho?

Si DIV 1000 lleva a cada bit dividida por 2, entonces yo esperaría

rAX = |+|617|0|1|0|-|0|1|0|1|1| 

en el que rA contiene los resultados de la división y rX los restos (llenas desde el lado derecho).

Probablemente me falta algo aquí, y Knuth parece pensar que debería ser capaz de resolverlo yo mismo (de ahí las preguntas de nivel 10, que tampoco entiendo), pero ¿podría alguien ayudarme? ¿aquí?

Respuesta

3

Así que lo descubrí por mi cuenta.

Si realiza la división a mano, al convertir los bytes en un solo número obtendrá -210.501.825 (si está utilizando el tipo de byte más pequeño, que es de 6 bits (!) En el libro de Knuths). Divida esto por -128, que es el valor en la ubicación 1000 utilizando el mismo tamaño de bytes.

El cociente es 1644545, el resto 65, el signo será positivo ya que ambos números son negativos. Si almacena 1.644.545 en la AR y 65 en Rx, obtendrá

|+|0|6|17|32|01| 
|-|0|0|0|1|1| 

utilizando el ByteSize más pequeño (que contiene 64 números). Dado que Knuth nunca asume un tamaño de bytes particular en sus ejemplos, rX tiene una serie de signos de interrogación. El signo de rX es siempre el signo previo de rA.

Editar: Utilicé la muy útil utilidad MixEmul para jugar con los registros de MIX. Esta es una implementación MIX muy bonita hecha en .NET