2016-09-20 2 views
4

실패이 내 명령어 세트 시뮬레이터 파이썬 스크립트입니다명령어 세트 시뮬레이터는

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이어야하지만 어떻게 가져올 지 모릅니다.

+0

여기서'ret'를 처리합니까? –

답변

3

가상 컴퓨터에서 ret 명령을 처리하는 기능이 누락되었습니다. 이런 식으로 작동해야합니다 :

def ret(opr): 
    reg['pc'] = memory[reg['sp']] 
    reg['sp'] = reg['sp'] - 1 
+1

SP도 조정하고 싶지 않으십니까? –

+0

''call'' 함수에서''sp''가 이미 증가했다고 생각합니다. – Schmuddi

+0

예,하지만'ret '는 어떻게해야한다고 생각합니까? 중첩 호출이 있었다고 상상해보십시오. 'ret'는 _SP_를 반대 방향으로 조정해야만합니다.'call'은 리턴 주소를 효과적으로 팝하기 위해서였습니다. _PC_를 스택 맨 위에 놓는 것만으로 리턴 주소를 끄지 않습니다. –

관련 문제