Implementando multiplicación

4

Estoy tratando de implementar la multiplicación en una CPU que diseñé. Estoy tratando de lograr esto con algunas condiciones. Solo tengo dos registros de propósito general, Rx y Ry, y estas instrucciones:

  • Agregar Rx, Ry [Agregar tomar Rx y Ry a ALU y devolver el resultado a Rx]
  • LD Rx, address [Load toma los datos en la RAM de la dirección y los carga a Rx]
  • STR Rx, dirección [La tienda toma los datos de Rx y los almacena en la RAM]
  • BZ Rx, Ry, Address [Sucursal compara los datos en dos registros. Salta si es igual]
  • Dirección de salto [Salta a dirección]

Si solo tengo 2 registros y RAM, ¿hay alguna forma de implementar la multiplicación? Sé que la forma general de implementarlo es mediante el uso de turnos, pero no tengo implementado y preferiría no hacerlo. Estaba pensando en hacer una llamada adicional, pero parece que no consigo ese trabajo ya que solo tengo 2 registros.

EDITAR: Puede seleccionar qué registro se direcciona a ellos 0 o 1. Además, mi RAM tiene solo 16 bytes y el bus solo tiene 8 bits dentro de la CPU.

  • Añadir Rx, Ry [Rx < = Rx + Ry]
  • LD Rx, dirección [Rx < = RAM (dirección)]
  • STR Rx, dirección [RAM (dirección) < = Rx]
  • BZ Rx, Ry, Address [Branch to Address If Rx == Ry]
  • Dirección de salto [Salta a dirección]

La dirección es una constante de 4 bits almacenada en la instrucción. Rx o Ry son 1 bit. OPCODE es de 4 bits, con la excepción de LD y STR, donde el cuarto bit de OPCode se refiere a la selección de registros.

    
pregunta John Smith

2 respuestas

1

Como mínimo, necesita una instrucción de bifurcación que pueda determinar si la adición anterior generó un carry. Además, el rendimiento mejorará enormemente si expande su conjunto de registros a tres o cuatro registros.

Comience con un operando en R0 y el otro en R1. Comienza con R2 cero.

Repita la siguiente secuencia ocho veces (el primer ADD se puede omitir en la primera pasada)

  Add R2,R2
  Add R0,R0
  Bnc Skip
  Add R2,R1
Skip:

Tenga en cuenta que si el conjunto de instrucciones incluye una instrucción add-with-carry, usarla para la segunda instrucción haría que esta secuencia de instrucciones produzca un resultado de 16 bits en R0: R2. Además, si R2 comienza a no ser cero, su valor multiplicado por 256 se agregará al resultado saliente.

    
respondido por el supercat
0

No creo que Add, Load / Store, y Branch If Zero, y Jump sean un conjunto de instrucciones "Turing Complete" o lo que sea. Es decir, no creo que pueda construir la multiplicación (entre otras cosas) usando solo estas instrucciones. Aunque solo una conjetura.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas