¿Cómo ejecutar una instrucción de 11 dígitos usando diferentes modos de direccionamiento en Python?

Aquí tenemos una instrucción de 11 bits que tiene los primeros 2 bits para representar el modo de direccionamiento, los siguientes 3 bits para el código de operación y los últimos 6 bits son para los dos operandos, 3 bits cada uno.
 

Ejecutaremos esta instrucción de 11 bits utilizando cuatro modos de direccionamiento diferentes: 
 

  1. Modo directo: en este modo, las direcciones de dos operandos se especifican en la instrucción. Podemos recibir los datos reales directamente de las direcciones de memoria.
  2. Modo indirecto: En este modo, las direcciones mencionadas en la instrucción apuntan a las direcciones efectivas de los operandos.
  3. Modo inmediato: en este modo, los datos reales se mencionan en la instrucción misma.
  4. Modo de registro: en este modo, la instrucción contiene las direcciones de los registros que contienen los datos reales.

Usaremos los primeros 2 bits para representar los cuatro modos de direccionamiento diferentes de esta manera: 
 

For direct mode- 00
For indirect mode- 01
For immediate mode- 10
For register mode- 11

Los siguientes 3 bits son para representar el código de operación, por lo que podemos usar 8 operaciones diferentes como máximo. Definiremos 6 operaciones y las otras dos quedarán reservadas para futuro de esta forma: 
 

000- Do nothing
001- Addition
010- Subtraction
011- Multiplication
100-Division
101-Transfer operand2 to operand1
110-Reserve for future
111-Reserve for future

Los siguientes 3 bits son para el operando1 y los últimos 3 bits son para el operando2, por lo que los valores de los operandos oscilarán entre 0 y 7 en modo inmediato.
Para el modo directo, indirecto y de registro, necesitamos definir una array de memoria y una array de registro. Como solo tenemos 3 bits para representar las direcciones, el número máximo de elementos en estas arrays será 8.
 

memory=[2,15,40,25,7,36,64,19]
register=[17,20,43,52,None,None,None,None]

Aquí, la memoria contiene 8 datos y el registro contiene 4 datos. El concepto discutido anteriormente funcionará de la siguiente manera:
 

Entrada: 01001000100

Aquí, de izquierda a derecha
Modo-01- Modo indirecto
Opcode-001- Suma
Operando1-000- 0
Operando2 – 100- 4
Como es el modo indirecto, estos operandos dan las direcciones de la dirección efectiva de los datos.
Significa que las direcciones efectivas están presentes en las ubicaciones de memoria 0 y 4, que son 2 y 7.
Y los datos reales están presentes en las ubicaciones de memoria 2 y 7, que son 40 y 19.
Entonces, el resultado será la suma de 40 y 19

Salida: 59

Ejemplo: 

Python

memory=[2,15,40,25,7,36,64,19]
register=[17,20,43,52,None,None,None,None]
  
#This function execute the instruction and print the result. 
def execute(st):
    mode=st[:2]
    opcode=st[2:5]
    operand1=st[5:8]
    operand2=st[8:]
    print()
    print("Instruction mode:",mode)
    print("Opcode:",opcode)
    print("operand1:",operand1)
    print("operand2:",operand2)
  
    #For direct mode
    if mode=='00':
        idx1=int(operand1,2)
        idx2=int(operand2,2)
        if opcode=='000':
            print("Do nothing")
        elif opcode=='001':
            print("RESULT")
            print(memory[idx1]+memory[idx2])
        elif opcode=='010':
            print("RESULT")
            print(memory[idx1]-memory[idx2])
        elif opcode=='011':
            print("RESULT")
            print(memory[idx1]*memory[idx2])
        elif opcode=='100':
            print("RESULT")
            print(memory[idx1]/memory[idx2])
        elif opcode=='101':
            print("RESULT")
            print("operand1=:")
            print(int(operand2,2))
        else:
            print("Reserve For Future")
  
    #For indirect mode
    elif mode=='01':
        idx1=int(operand1,2)
        idx2=int(operand2,2)
        idx1=memory[idx1]
        idx2=memory[idx2]
        if opcode=='000':
            print("Do nothing")
        elif opcode=='001':
            print("RESULT")
            print(memory[idx1]+memory[idx2])
        elif opcode=='010':
            print("RESULT")
            print(memory[idx1]-memory[idx2])
        elif opcode=='011':
            print("RESULT")
            print(memory[idx1]*memory[idx2])
        elif opcode=='100':
            print("RESULT")
            print(memory[idx1]/memory[idx2])
        elif opcode=='101':
            print("RESULT")
            print("operand1=:")
            print(int(operand2,2))
        else:
            print("Reserve For Future")
  
    #For immediate mode
    elif mode=='10':
        idx1=int(operand1,2)
        idx2=int(operand2,2)
        if opcode=='000':
            print("Do nothing")
        elif opcode=='001':
            print("RESULT")
            print(idx1+idx2)
        elif opcode=='010':
            print("RESULT")
            print(idx1-idx2)
        elif opcode=='011':
            print("RESULT")
            print(idx1*idx2)
        elif opcode=='100':
            print("RESULT")
            print(idx1/idx2)
        elif opcode=='101':
            print("RESULT")
            print("operand1=:")
            print(int(operand2,2))
        else:
            print("Reserve For Future")
  
    #For register mode
    else:
        idx1=int(operand1,2)
        idx2=int(operand2,2)
        if idx1>3 or idx2>3:
            print("Invalid")
            exit()
        if opcode=='000':
            print("Do nothing")
        elif opcode=='001':
            print("RESULT")
            print(register[idx1]+register[idx2])
        elif opcode=='010':
            print("RESULT")
            print(register[idx1]-register[idx2])
        elif opcode=='011':
            print("RESULT")
            print(register[idx1]*register[idx2])
        elif opcode=='100':
            print("RESULT")
            print(register[idx1]/register[idx2])
        elif opcode=='101':
            print("RESULT")
            print("operand1=:")
            print(int(operand2,2))
        else:
            print("Reserve For Future")
  
#driver code
st="00001000001"
execute(st);
st="01001000100"
execute(st);
st="10001000001"
execute(st);
st="11001000001"
execute(st);

Producción: 

Instruction mode: 00
Opcode: 001
operand1: 000
operand2: 001
RESULT
17

Instruction mode: 01
Opcode: 001
operand1: 000
operand2: 100
RESULT
59

Instruction mode: 10
Opcode: 001
operand1: 000
operand2: 001
RESULT
1

Instruction mode: 11
Opcode: 001
operand1: 000
operand2: 001
RESULT
37

Publicación traducida automáticamente

Artículo escrito por SUDIPTADANDAPAT y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *