gpt4 book ai didi

java - 来自不同对象/原语的字节堆栈

转载 作者:行者123 更新时间:2023-12-04 10:52:30 25 4
gpt4 key购买 nike

对于我的实验作业,我们必须做一个简单的虚拟机来运行一些基本指令。作业文档推荐并在 C 中给出了部分实现......但我想要在 Java 中。

对于java老师推荐我使用Java Nio ByteBuffer。然而 ByteBuffer 的行为不像堆栈。

更复杂的是,我不知道如何将 jmp 虚拟指令的地址放入堆栈。我正在考虑序列化 Instr 类的一个实例并将这些字节添加到堆栈中,但我担心这可能是堆栈的许多字节。

我用于表示虚拟指令的类:

public class Instr {

protected Instr(Opcode opcode2) {
opcode = opcode2;
}

public enum Opcode {
ADD_C, ADD_I, ADD_D, AND_A, AND_C, AND_I, AND_D, CALL, CALLEXT, CAST_C_D, CAST_C_I, CAST_D_C, CAST_D_I,
CAST_I_C, CAST_I_D, DIC_C, DIC_I, DIV_D, DROP, ENTER, EQ_A, EQ_C, EQ_I, EQ_D, GREATER_C, GREATER_I, GREATER_D,
GREATEREQ_C, GREATEREQ_I, GREATEREQ_D, HALT, INSERT, JF_A, JF_C, JF_I, JF_D, LESS_C, LESS_I, LESS_D, LESSEQ_C,
LESSEQ_I, LESSEQ_D, LOAD, MUL_C, MUL_I, MUL_D, NEG_C, NEG_I, NEG_D, NOP, NOT_A, NOT_C, NOT_I, NOT_D, NOTEQ_A,
NOTEQ_C, NOTEQ_I, NOTEQ_D, OFFSET, OR_A, OR_C, OR_I, OR_D, PUSHFPADDR, PUSHCT_A, PUSHCT_C, PUSHCT_I, PUSHCT_D,
RET, STORE, SUB_C, SUB_I, SUB_D
}

public Opcode opcode;
public Register val1;
public Register val2;

private class Register {
int i;
double d;
public Instr addr;
}
}

关于构建可以放置和弹出对象/原语的堆栈的任何建议?

这是我迄今为止的工作:
https://github.com/EmanuelSadu/AtomC

这是作业文档中的测试代码(C 语言):

此 VM 必须运行的示例:
在页面“MV”中,sunt prezentate toate instructiunile masinii virtuale。 Felul in care se folosesc acestea va fi detaliat
实验室专用一般 codului。在 Aces 实验室 vom testa MV pe un cod scris direct。鳕鱼护理示例
实现 „v=3;do{put_i(v);v=v-1;}while(v);”埃斯特:
void mvTest()
{
Instr *L1;
int *v=allocGlobal(sizeof(long int));
addInstrA(O_PUSHCT_A,v);
addInstrI(O_PUSHCT_I,3);
addInstrI(O_STORE,sizeof(long int));
L1=addInstrA(O_PUSHCT_A,v);
addInstrI(O_LOAD,sizeof(long int));
addInstrA(O_CALLEXT,requireSymbol(&symbols,"put_i")->addr);
addInstrA(O_PUSHCT_A,v);
addInstrA(O_PUSHCT_A,v);
addInstrI(O_LOAD,sizeof(long int));
addInstrI(O_PUSHCT_I,1);
addInstr(O_SUB_I);
addInstrI(O_STORE,sizeof(long int));
addInstrA(O_PUSHCT_A,v);
addInstrI(O_LOAD,sizeof(long int));
addInstrA(O_JT_I,L1);
addInstr(O_HALT);
}

最佳答案

远离 Java 内置序列化,这是平台早期的旧机制和 error prone .您最好为此作业编写自己的简单格式。

你可以自己写 StackByteBuffer 支持的类, 例如:

public class Stack {
private final ByteBuffer buf;

public Stack(int capacity) {
buf = ByteBuffer.allocate(capacity);
}

public void push(byte b) {
buf.put(b);
}

public byte pop() {
if (buf.position() == 0) {
throw new NoSuchElementException();
}
buf.position(buf.position() - 1);
return buf.get(buf.position());
}

}

关于java - 来自不同对象/原语的字节堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com