【问题标题】:Instruction set simulator written in Python fails [closed]用 Python 编写的指令集模拟器失败 [关闭]
【发布时间】:2016-09-20 16:05:28
【问题描述】:

这是我的指令集模拟器 Python 脚本:

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 包含要运行的汇编语言指令:

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

我期望的输出是:

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

标签: python function memory assembly printing


【解决方案1】:

您的虚拟机缺少处理ret 命令的函数。像这样的东西应该可以工作:

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

【讨论】:

  • 你不是也想调整SP吗?
  • 我认为sp已经在call函数中增加了。
  • 是的,但是您认为ret 应该怎么做?想象一下,如果您有嵌套调用。 ret 需要将 SP 调整为与 call 所做的相反方向以有效弹出返回地址。只需将 PC 设置为顶部的内容堆栈不会弹出该返回地址。
  • @Michael Petch:没错,绝对没错。我相应地改变了方法。
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 2012-11-06
  • 2018-08-03
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多