This is an example of the answer to the 2013 summer hospital exam.
--Assembly
It is not already in the official archive of the University of Tokyo, and here we will publish the one obtained from other archive services, but if the University of Tokyo points out, we will delete the problem statement.
Prog.txt is not open to the public, so the following was made by the author (I didn't make prog5.txt because it is too tight).
prog1.txt
SET x 1
prog2.txt
SET x 1
SET y 0
ADD x y
PRN x y
PRN 30 y
prog3.txt
SET x 1
SET y 0
ADD x y
ADD 1 x
CMP x 10
JMP -3 0
PRN x y
SET x 0
SET y 1
SUB 4 0
CMP 10 y
ADD y x
JMP 5 0
SUB 2 0
BAK 0 0
ADD 1 y
BAK 0 0
PRN x y
(1)
file_path = 'prog1.txt'
def solve(file_path):
with open(file_path, encoding='ascii') as f:
line1 = f.readline()
code_array = line1.split(' ')
order = code_array[0]
operand1 = code_array[1]
operand2 = code_array[2]
print(operand1)
y = 0
x = 1
while (x != 10):
y += x
x += 1
print(x, y)
(3)
import sys
sys.path.append('..')
import IsStrNumber as isn
file_path = 'prog2.txt'
def solve(file_path):
max_order = 100
orders = []
register = { 'x': 0, 'y': 0 }
with open(file_path, encoding='ascii') as f:
for i in range(0, max_order):
line = f.readline()
if (line != ''):
line = line.rstrip('\n')
code_array = line.split(' ')
orders.append(code_array)
def compileOrder(order, op1, op2):
if (order == 'ADD'):
if (isn.isNumber(op1)):
register[op2] += isn.STRtoNumber(op1)
else:
register[op2] += register[op1]
elif (order == 'PRN'):
if (isn.isNumber(op1)):
if (isn.isNumber(op2)):
print(isn.STRtoNumber(op1), isn.STRtoNumber(op2))
else:
print(isn.STRtoNumber(op1), register[op2])
else:
if (isn.isNumber(op2)):
print(register[op1], isn.STRtoNumber(op2))
else:
print(register[op1], register[op2])
elif (order == 'SET'):
if (isn.isNumber(op2)):
register[op1] = isn.STRtoNumber(op2)
else:
register[op1] = register[op2]
for i in range(0, len(orders)):
order = orders[i][0]
op1 = orders[i][1]
op2 = orders[i][2]
compileOrder(order, op1, op2)
(4)
import sys
sys.path.append('..')
import IsStrNumber as isn
file_path = 'prog3.txt'
def solve(file_path):
max_order = 100
orders = []
register = {}
with open(file_path, encoding='ascii') as f:
for i in range(0, max_order):
line = f.readline()
if (line != ''):
line = line.rstrip('\n')
code_array = line.split(' ')
orders.append(code_array)
#These are because python's global variables are too hard to use
next_order = { 'num': 0 }
def compileOrder(order, op1, op2):
if (order == 'ADD'):
next_order['num'] += 1
if (isn.isNumber(op1)):
register[op2] += isn.STRtoNumber(op1)
else:
register[op2] += register[op1]
elif (order == 'PRN'):
next_order['num'] += 1
if (isn.isNumber(op1)):
if (isn.isNumber(op2)):
print(isn.STRtoNumber(op1), isn.STRtoNumber(op2))
else:
print(isn.STRtoNumber(op1), register[op2])
else:
print(register[op1], register[op2])
elif (order == 'SET'):
next_order['num'] += 1
if (isn.isNumber(op2)):
register[op1] = isn.STRtoNumber(op2)
else:
register[op1] = register[op2]
elif (order == 'CMP'):
next_order['num'] += 1
if (isn.isNumber(op1)):
if (isn.isNumber(op2)):
if (isn.STRtoNumber(op1) == isn.STRtoNumber(op2)):
next_order['num'] += 1
else:
if (isn.STRtoNumber(op1) == register[op2]):
next_order['num'] += 1
else:
if (isn.isNumber(op2)):
if (register[op1] == isn.STRtoNumber(op2)):
next_order['num'] += 1
else:
if (register[op1] == register[op2]):
next_order['num'] += 1
elif (order == 'JMP'):
if (isn.isNumber(op1)):
next_order['num'] += isn.STRtoNumber(op1)
else:
next_order['num'] += register[op1]
while (next_order['num'] < len(orders)):
order = orders[next_order['num']][0]
op1 = orders[next_order['num']][1]
op2 = orders[next_order['num']][2]
# print(order, op1, op2)
compileOrder(order, op1, op2)
(5)
import sys
sys.path.append('..')
import IsStrNumber as isn
file_path = 'prog4.txt'
def solve(file_path):
max_order = 100
orders = []
register = {}
with open(file_path, encoding='ascii') as f:
for i in range(0, max_order):
line = f.readline()
if (line != ''):
line = line.rstrip('\n')
code_array = line.split(' ')
orders.append(code_array)
#These are because python's global variables are too hard to use
next_order = { 'num': 0 }
sub_order_stack = []
def compileOrder(order, op1, op2):
if (order == 'ADD'):
next_order['num'] += 1
if (isn.isNumber(op1)):
register[op2] += isn.STRtoNumber(op1)
else:
register[op2] += register[op1]
elif (order == 'PRN'):
next_order['num'] += 1
if (isn.isNumber(op1)):
if (isn.isNumber(op2)):
print(isn.STRtoNumber(op1), isn.STRtoNumber(op2))
else:
print(isn.STRtoNumber(op1), register[op2])
else:
print(register[op1], register[op2])
elif (order == 'SET'):
next_order['num'] += 1
if (isn.isNumber(op2)):
register[op1] = isn.STRtoNumber(op2)
else:
register[op1] = register[op2]
elif (order == 'CMP'):
next_order['num'] += 1
if (isn.isNumber(op1)):
if (isn.isNumber(op2)):
if (isn.STRtoNumber(op1) == isn.STRtoNumber(op2)):
next_order['num'] += 1
else:
if (isn.STRtoNumber(op1) == register[op2]):
next_order['num'] += 1
else:
if (isn.isNumber(op2)):
if (register[op1] == isn.STRtoNumber(op2)):
next_order['num'] += 1
else:
if (register[op1] == register[op2]):
next_order['num'] += 1
elif (order == 'JMP'):
if (isn.isNumber(op1)):
next_order['num'] += isn.STRtoNumber(op1)
else:
next_order['num'] += register[op1]
elif (order == 'SUB'):
#Save the next order to stack
sub_order_stack.append(next_order['num']+1)
compileOrder('JMP', op1, op2)
elif(order == 'BAK'):
next_order['num'] = sub_order_stack.pop()
while (next_order['num'] < len(orders)):
order = orders[next_order['num']][0]
op1 = orders[next_order['num']][1]
op2 = orders[next_order['num']][2]
# print(order, op1, op2)
compileOrder(order, op1, op2)
(6)
import sys
sys.path.append('..')
import IsStrNumber as isn
file_path = 'prog3.txt'
def solve(file_path):
max_order = 100
orders = []
with open(file_path, encoding='ascii') as f:
for i in range(0, max_order):
line = f.readline()
if (line != ''):
line = line.rstrip('\n')
code_array = line.split(' ')
orders.append(code_array)
#These are because python's global variables are too hard to use
next_order = { 'num': 0 }
sub_order_stack = []
# register_stack[0]Global register(Actual register)To
register_stack = [{}]
# register_Realize local registers by using the register object at the end of the stack
def compileOrder(order, op1, op2):
if (order == 'ADD'):
next_order['num'] += 1
if (isn.isNumber(op1)):
register_stack[len(register_stack)-1][op2] += isn.STRtoNumber(op1)
else:
register_stack[len(register_stack)-1][op2] += register_stack[len(register_stack)-1][op1]
elif (order == 'PRN'):
next_order['num'] += 1
if (isn.isNumber(op1)):
if (isn.isNumber(op2)):
print(isn.STRtoNumber(op1), isn.STRtoNumber(op2))
else:
print(isn.STRtoNumber(op1), register_stack[len(register_stack)-1][op2])
else:
print(register_stack[len(register_stack)-1][op1], register_stack[len(register_stack)-1][op2])
elif (order == 'SET'):
next_order['num'] += 1
if (isn.isNumber(op2)):
register_stack[len(register_stack)-1][op1] = isn.STRtoNumber(op2)
else:
register_stack[len(register_stack)-1][op1] = register_stack[len(register_stack)-1][op2]
elif (order == 'CMP'):
next_order['num'] += 1
if (isn.isNumber(op1)):
if (isn.isNumber(op2)):
if (isn.STRtoNumber(op1) == isn.STRtoNumber(op2)):
next_order['num'] += 1
else:
if (isn.STRtoNumber(op1) == register_stack[len(register_stack)-1][op2]):
next_order['num'] += 1
else:
if (isn.isNumber(op2)):
if (register_stack[len(register_stack)-1][op1] == isn.STRtoNumber(op2)):
next_order['num'] += 1
else:
if (register_stack[len(register_stack)-1][op1] == register_stack[len(register_stack)-1][op2]):
next_order['num'] += 1
elif (order == 'JMP'):
if (isn.isNumber(op1)):
next_order['num'] += isn.STRtoNumber(op1)
else:
next_order['num'] += register_stack[len(register_stack)-1][op1]
elif (order == 'SUB'):
#Save the next order to stack
sub_order_stack.append(next_order['num']+1)
compileOrder('JMP', op1, op2)
elif (order == 'BAK'):
next_order['num'] = sub_order_stack.pop()
elif (order == 'CAL'):
sub_order_stack.append(next_order['num']+1)
new_register = { 'in': 0 }
if (isn.isNumber(op2)):
new_register['in'] = isn.STRtoNumber(op2)
else:
new_register['in'] = register_stack[len(register_stack)-1][op2]
compileOrder('JMP', op1, op2)
#JMP and then add local registers to the stack
register_stack.append(new_register)
elif (order == 'RET'):
next_order['num'] = sub_order_stack.pop()
#Clear local registers
old_register = register_stack.pop()
#Add out to the local register immediately after exiting so that you can use out after exiting the local
if (isn.isNumber(op1)):
register_stack[len(register_stack)-1]['out'] = isn.STRtoNumber(op1)
else:
register_stack[len(register_stack)-1]['out'] = old_register[op1]
while (next_order['num'] < len(orders)):
order = orders[next_order['num']][0]
op1 = orders[next_order['num']][1]
op2 = orders[next_order['num']][2]
# print(order, op1, op2)
compileOrder(order, op1, op2)
――Honestly, I only know assembly language as knowledge, and I haven't actually written much ([Patahene](https://www.amazon.co.jp/%E3%82%B3%E3%83] % B3% E3% 83% 94% E3% 83% A5% E3% 83% BC% E3% 82% BF% E3% 81% AE% E6% A7% 8B% E6% 88% 90% E3% 81% A8 % E8% A8% AD% E8% A8% 88-% E7% AC% AC5% E7% 89% 88-% E4% B8% 8A-% E3% 82% B8% E3% 83% A7% E3% 83% B3% E3% 83% BBL-% E3% 83% 98% E3% 83% 8D% E3% 82% B7% E3% 83% BC / dp / 4822298426 / ref = sr_1_1? __mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & crid = 2AYMYC67XORO & keywords =% E3% 83% 91% E3% 82% BF% E3% 83% 98% E3% 83% 8D & qid = 1573369857 & sprefix =% E3% 83% 91% E3% 82% BF% E3% 83% 98% E3% 83% 8D% 2Caps% 2C285 & sr = 8-1) and Introduction to OS self-made % E6% 97% A5% E3% 81% A7% E3% 81% A7% E3% 81% 8D% E3% 82% 8B-OS% E8% 87% AA% E4% BD% 9C% E5% 85% A5 % E9% 96% 80-% E5% B7% 9D% E5% 90% 88-% E7% A7% 80% E5% AE% 9F / dp / 4839919844 / ref = sr_1_1? __mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & crid = 3AFCH381UQPGM & keywords = os% E8% 87% AA% E4% BD% 9C% E5% 85% A5% E9% 96% 80 & qid = 1573369893 & sprefix = OS% E8% 87% AA% E4% BD% 9C% 2Caps% 2C279 & sr = 8-1) I wrote a little bit about it ...), so it took quite a while to solve. --Probably people who have never touched the assembly do not have the concept of managing with a stack, so I feel like I'm stuck with (5) and (6). (If anything, it may get stuck in (4)). -I think that the idea of (5) and (6) is correct, but there is a high possibility that it is wrong because it cannot be verified because there is no distribution file. (Especially (6) may be suspicious ...) ――I thought it was a very good educational issue!
Recommended Posts