Virtual machine “错误”;“段空间外”;在VMEmulator中,由Jack中的getter方法引起

Virtual machine “错误”;“段空间外”;在VMEmulator中,由Jack中的getter方法引起,virtual-machine,nand2tetris,Virtual Machine,Nand2tetris,我正在为NAND2TTERIS做一个项目。我们用Jack编写了一个程序,并在VMEmulator上进行了测试。该类如下所示: class List { field int data; field List next; /* Creates a new List object. */ constructor List new(int car, List cdr) { let data = car; let next = cdr;

我正在为NAND2TTERIS做一个项目。我们用Jack编写了一个程序,并在VMEmulator上进行了测试。该类如下所示:

class List {
    field int data;
    field List next;

    /* Creates a new List object. */
    constructor List new(int car, List cdr) {
        let data = car;
        let next = cdr;
        return this;
    }

    /* Disposes this List by recursively disposing its tail. */
    method void dispose() {
        if (~(next = null)) {
            do next.dispose();
        }
        // Use an OS routine to recycle the memory held by this object.
        do Memory.deAlloc(this);
        return;
    }

    /* Prints the list*/

    method void print() {
        do Output.printString(" -> ");
        do Output.printInt(data);
        if (~(next =  null)) {
            do next.print();
        }
        return;
    }

    /* Inserts the argument in the right position of the list (ascending order)*/
    method void insertInOrder(int ins){
        var List prev, curr, insert;
        let prev = this;
        let curr = prev.getnext();
        while (ins > prev.getdata()){
            if (ins < curr.getdata()){
                let insert = List.new(ins, curr);
                do prev.setnext(insert);
            }
            else{
                let prev = prev.getnext();
                let curr = prev.getnext();
            }
        }
        return;
    }

    /* Searches the argument in the list, if found, it returns the corresponding List object*/
    method List find(int toFind){
        var List temp;
        var List equal;
      var boolean found;
        let temp = this;
        let found = false;
        while (~(next = null)){
            if(toFind = temp.getdata()){
                let equal = temp;
                let found = true;
            }
            let temp = temp.getnext();
        }
        if (found){
            return equal;
        }
        else{
            return null;
        }
  }

    method List getnext(){
        return next;
    }

    method void setnext(List object){
        let next = object;
        return;
    }

    method int getdata(){
        return data;
    }

}
错误出现在第4行
返回
。当我更改插孔代码时,第4行仍然存在相同的错误


“我的getter方法”中的具体问题是什么?

在VMEmulator上运行VM程序时,必须首先手动设置指向各个段的指针,否则可能会出现“段空间不足”错误。 要了解必要的设置,请查看相应的.tst文件的功能。另一种方法是在函数中插入建议的代码,因为函数调用会自动进行此类设置

0function    List.getdata0
1push        argument0
2pop         pointer0
3push        this 0
4return