실패이 내 명령어 세트 시뮬레이터 파이썬 스크립트입니다명령어 세트 시뮬레이터는
0 movv sp 80
1 movv a 100
2 movv b 400
3 call 20
4 add a b
5 out acc
6 halt
20 push a
21 push b
22 push acc
23 movv a 20
24 movv b 80
25 add a b
26 out acc
27 pop acc
28 pop b
29 pop a
30 ret
I가 기대하는 출력을 :
MEM_SIZE=100;
reg={'a':0, 'b':0, 'c':0, 'd':0, 'e':0,'f':0,'sp':0,'acc':0, 'pc':0, 'ivec':0, 'int':0, 'timer':0, 'halt':False};
memory=[0]*MEM_SIZE;
def mov(opr):
reg[opr[0]]=reg[opr[1]];
reg['pc']=reg['pc']+1;
def movv(opr):
reg[opr[0]]=int(opr[1]);
reg['pc']=reg['pc']+1;
def load(opr):
reg[opr[0]]=memory[int(opr[1])];
reg['pc']=reg['pc']+1;
def loadr(opr):
reg[opr[0]]=memory[reg[opr[1]]];
reg['pc']=reg['pc']+1;
def add(opr):
reg['acc']=reg[opr[0]]+reg[opr[1]];
reg['pc']=reg['pc']+1;
def sub(opr):
reg['acc']=reg[opr[0]]-reg[opr[1]];
reg['pc']=reg['pc']+1;
def call(opr):
reg['sp']=reg['sp']+1;
memory[reg['sp']]=reg['pc']+1;
reg['pc']=int(opr[0]);
def out(opr):
print reg[opr[0]];
reg['pc']=reg['pc']+1;
def push(opr):
reg['sp']=reg['sp']+1;
memory[reg['sp']]=reg[opr[0]];
reg['pc']=reg['pc']+1;
def pop(opr):
reg[opr[0]]=memory[reg['sp']];
reg['sp']=reg['sp']-1;
reg['pc']=reg['pc']+1;
def halt(opr):
reg['halt']=True;
reg['pc']=reg['pc']+1;
f=open('ass-2.asm','r');
def runm():
while reg['halt']==False:
i=reg['pc'];
op=globals()[memory[i][0]];
#print i,memory[i][0:] ;
op(memory[i][1:]);
pass;
reg['timer']=reg['timer']-1;
if reg['int']==1 and reg['timer']==0:
reg['sp']=reg['sp']+1;
memory[reg['sp']]=reg['pc'];
reg['pc']=reg['ivec'];
reg['int']=0;
for l in f:
if l.startswith("#"):
continue;
comm= l.split();
if comm:
memory[int(comm[0])] = comm[1:];
runm();
print reg;
print memory;
이 파일 ass-2.asm
실행 어셈블리 언어 지침이 포함되어 있습니다 :
100
500
출력 및 오류 :
100
Traceback (most recent call last):
File "sim.py", line 86, in <module>
runm();
File "sim.py", line 64, in runm
op=globals()[memory[i][0]];
KeyError: 'ret'
이 문제는 runm
기능에있는 것으로 보입니다.
함수가 호출되기 전에 2 개의 숫자가 레지스터에로드되어야하며 함수 호출 후에이 숫자를 추가해야한다고 생각합니다! 인쇄 된 메모리 값은 500이어야하지만 어떻게 가져올 지 모릅니다.
여기서'ret'를 처리합니까? –