2012-04-09 28 views
5

Lo que necesito hacer es implementar tanto un desplazamiento a la izquierda en modo bit como un cambio a la derecha en modo bit utilizando LC-3 Assembly. Básicamente, cada bit debe moverse sobre un espacio en la dirección del cambio, y un cero llena el espacio vacío creado.LC3 Assembly Bitwise Right Shift

Ejemplos:

Desplazamiento a la derecha:

01001001 
00100100→ 

Mayúsculas izquierda:

01001001 
←10010010 

he implementado con éxito una desviación a la izquierda, tomando la cadena binaria, y agregarlo a sí mismo .

Estoy perplejo sobre cómo realizar un cambio a la derecha. Cualquier pensamiento sería muy apreciado. Tengo operaciones AND, NOT, ADD, operaciones de movimiento de datos, siete registros para almacenar valores y todo el rango de memoria. Solo necesito algunas ideas básicas sobre cómo podría implementarse.

Si necesita una referencia del conjunto de instrucciones LC-3, hay one here.

+0

líder para una referencia LC-3 ISA : http://www.cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf –

Respuesta

1

Guau, ese es un conjunto de instrucciones mínimas.

Si tiene 256 bytes de memoria disponibles, entonces una tabla de búsqueda podría ser el camino a seguir.

Puede hacerlo sin memoria de datos utilizando un bucle en cada posición de bit, usando AND para extraer el bit.

+0

¿Puedes echarle un vistazo a esto? http://stackoverflow.com/questions/30017878/where-is-32768-coming-from – committedandroider

4

Supongamos que configura R2 para que tenga un solo conjunto de bits. Luego, si realiza un AND con otro registro y rama en la condición Z, está probando si ese bit está configurado. Si lo es, desea establecer el bit anterior en su registro de "resultado".

Si luego cambia su registro de un solo bit en un lugar y lo repite en un bucle, debe tener lo que necesita.

(Disculpas si esto es vaga; ya que esta es probablemente la tarea que estoy tratando de evitar simplemente darle la respuesta)

Editar:

Así, supongamos que su entrada es 01001011. Se empieza con una salida de 00000000, una máscara de entrada de 00000010 y una máscara de salida de 00000001. Hace la Y y encuentra que no es cero, por lo que agrega la máscara de salida a la salida. A continuación, cambia ambas máscaras para obtener 00000100 y 00000010.

En la próxima vez que pasa el ciclo, AND es cero, por lo que no agrega nada, y así sucesivamente. El ciclo termina cuando el cambio de la máscara lo hace cero.

+0

Esto podría funcionar, pero me parece que debe haber una manera más simple de implementarlo (como agregarlo a sí mismo en el turno de la izquierda) Tiene razón en que es tarea, y debe entregarse este miércoles (apr 11), así que tengo un par de días para buscar una solución mejor antes de "forzarla brutalmente" con este enfoque. –

+0

Esto no es exactamente "fuerza bruta"; son solo 9 líneas de código, incluida la configuración. –

0

Necesita dos máscaras. Ambos son un solo "1" con el resto de ellos "0" s. Ambos se inicializan a 0000 0000 0000 0001, pero uno de ellos se desplaza hacia la izquierda en una cantidad que desea que el número original se desplace a la derecha. Llamaremos a Mask1. El número sin desplazamiento será Mask2.

Comparar Mask1 con el número original. If (Mask1 "y" input)> o < 0, "o" Mask2 con salida y luego hacia la izquierda ambas Máscaras.

En cualquier caso, desplace ambas Máscara a la izquierda y vuelva a intentar hasta que no haya más bits en la entrada para probar.

LC-3 no tiene un "o" bit a bit. Deberá "no" ambos operandos, "y" ellos, luego "no" el resultado para un bit a bit "o".

La razón por la que está probando si Mask1 "y" input is> o < 0 es porque si es cero, no queremos hacer nada. Si el resultado de "y" ing estos operandos es> 0, significa que la posición probada encontró un "1" y debe imprimirse en el resultado. Si la máscara se ha desplazado hacia la izquierda para convertirse en 1000 0000 0000 0000, técnicamente es un número negativo. El "y" de eso y cualquier número con un "1" en esa posición también será un número negativo.

+0

Puede 'agregar' en lugar de' o' si sabe que no hay acarreo. Este es el caso aquí porque trabajas un poco a la vez. –

0

Asumiendo un 0 en primer lugar, puede dividir por 2 restando una y otra vez.

Por lo tanto contar con qué frecuencia puede agregar RX, RX, # -2

Estoy seguro de que también es una manera de trabajar alrededor de un vínculo de trabajo 1.

+1

un camino alrededor del recordatorio 1 sería, ay el registro con 0xFE antes de dividir. pero esta solución parece muy lenta para mí – Tommylee2k