Part III: Decode a Machine Instruction (20 points) The Fictional KIPS Computer F
ID: 3717238 • Letter: P
Question
Part III: Decode a Machine Instruction (20 points) The Fictional KIPS Computer For this part you will implement a function that decodes machine language instructions of a fictional computer we will call the KIPS. You should read through the Unit 9 lecture notes before starting this part. KIPS supports the following instructions that the CPU can execute add dest , op 1 , op2: Performs an addition. dest is the desination register where the sum of regis- ters op1 and op2 will be saved. (dest -opl op2) » sub dest, opl, op2: Performs a subtraction. dest is the desination register where the difference of » mul dest, opl, op2: Performs a multiplication. dest is the desination register where the product » div dest, opl, op2: Performs an integer division. dest is the desination register where the quotient · 11 dest, immediate: Stores the value immediate in register dest. (i.e.,dest = immediate) registers op1 and op2 will be saved. (destopl- op2) of registers op 1 and op2 will be saved. (dest = op1 * op2) of registers op1 and op2 will be saved. (dest opl op2) Recall from lecture that an immediate value is simply a constant. As with the real MIPS computer, the KIPS computer has 10 registers numbered $t0, $t1, ..., $t 9. In the above list of instructions, dest, opl and op2 are registers. immediateis a positive integer (or zero) Instruction Formats Every KIPS instruction is exactly 32 bits in length. An arithmetical instruction's bits are divided up as follows CSE 101 - Spring 2018 Lab #12 Page 3 Note that bit #0 is the rightmost bit Opcode Destination Register First Operand Second Operand Bits 24-31Bits 16-23 Bits 8-15 Bits 0-7 Let's look at an example instruction to understand this format a little better:Explanation / Answer
#Define function
def decode_instruction(inst):
#Define value for opcode mask
opMask = 0b11111111000000000000000000000000
#Perform operation
opcode = inst & opMask
#Compute opcode
opcode = opcode>>24
#Declare variable
dest = 0
#Declare variable
imm = 0
#Declare variable
op1 = 0
#Declare variable
op2 = 0
#Create variable
retVal = tuple()
#Create mask for destination
destMask = 0b00000000111111110000000000000000
#Perform operation
dest = inst & destMask
#Compute destination
dest = dest >>16
#If li instruction
if(opcode==4):
#Create variable
immdMask = 0b00000000000000001111111111111111
#Find immediate value
imm = inst & immdMask
#Set value
retVal = (opcode, dest, imm)
#Check condition
if(dest <0 or dest >10):
#Set value
retVal = (-1, -1, -1, -1)
#If add, sub , mul, div instruction
elif (opcode ==0 or opcode ==1 or opcode == 2 or opcode==3):
#Define mask for opcode 1
op1Mask = 0b00000000000000001111111100000000
#Compute value
op1 = inst & op1Mask
#find opcode 1
op1 = op1>>8
#Define mask for opcode 2
op2Mask = 0b00000000000000000000000011111111
#Find opcode 2
op2 = inst & op2Mask
#Set value
retVal = (opcode, dest, op1, op2)
#Check condition
if(dest <0 or dest >10):
#Set value
retVal = (-1, -1, -1, -1)
#Check condition
if(op1 <0 or op1 >10):
#Set value
retVal = (-1, -1, -1, -1)
#Check condition
if(op2 <0 or op2 >10):
#Set value
retVal = (-1, -1, -1, -1)
#Else
else:
#Set value
retVal = (-1, -1, -1, -1)
#Return
return retVal
#Sample Run
#Call function
print(decode_instruction(0x01050000))
print(decode_instruction(0x00040407))
print(decode_instruction(0x01010207))
print(decode_instruction(0x00090400))
print(decode_instruction(0x00090005))
print(decode_instruction(0x01050600))
print(decode_instruction(0x04060614))
print(decode_instruction(0x02000c05))
print(decode_instruction(0x07020403))
print(decode_instruction(0x04110752))