Я пытаюсь создать виртуальную машину, которая будет запускать простые вещи на данный момент.Однако после компиляции я попытался запустить его, но получил ошибку сегментации.Есть 4 файла: stack-vm.h
, stack-vm.cpp
, main.cpp
, makefile
.
stack-vm.h:
#ifndef STACK_VM_H
#define STACK_VM_H
#include <iostream>
#include <vector>
//type definitions
typedef int32_t i32;
class StackVM {
private:
i32 pc = 100; // program counter
i32 sp = 0; // stack pointer
std::vector<i32> memory;
i32 typ = 0;
i32 dat = 0;
i32 running = 1;
i32 getType(i32 instruction);
i32 getData(i32 instruction);
void fetch();
void decode();
void execute();
void doPrimitive();
public:
StackVM();
void run();
void loadProgram(std::vector<i32> prog);
};
#endif
stack-vm.cpp:
#include "stack-vm.h"
StackVM::StackVM() {
memory.reserve(1000000);
}
i32 StackVM::getType(i32 instruction) {
i32 type = 0xc0000000;
type = (type & instruction) >> 30;
return type;
}
i32 StackVM::getData(i32 instruction) {
i32 data = 0x3fffffff;
data = data & instruction;
return data;
}
void StackVM::fetch() {
pc++;
}
void StackVM::decode() {
typ = getType(memory[pc]);
dat = getData(memory[pc]);
}
void StackVM::execute() {
if (typ == 0 || typ == 2) {
sp++;
memory[sp] = dat;
} else {
doPrimitive();
}
}
void StackVM::doPrimitive() {
switch (dat) {
case 0: // halt
std::cout << "halt" << std::endl;
running = 0;
break;
case 1: // add
std::cout << "add " << memory[sp - 1] << " " << memory[sp] << std::endl;
memory[sp - 1] = memory[sp - 1] + memory[sp];
break;
}
}
void StackVM::run() {
pc -= 1;
while (running) {
fetch();
decode();
execute();
std::cout << "tos: " << memory[sp] << std::endl;
}
}
void StackVM::loadProgram(std::vector<i32> prog) {
for (i32 i = 0; 1 < prog.size(); i++) {
memory[pc + i] = prog[i];
}
}
main.cpp:
#include "stack-vm.h"
int main(int argc, char* argv[]) {
StackVM vm;
std::vector<i32> prog{3, 4, 0x40000001, 0x40000000};
vm.loadProgram(prog);
return 0;
}
makefile:
CFLAGS=-std=c++11
all: stack-vm
stack-vm: stack-vm.o main.o
$(CXX) $(CFLAGS) stack-vm.o main.o -o stack-vm
main.o: main.cpp
$(CXX) $(CFLAGS) -c main.cpp
stack-vm.o: stack-vm.h stack-vm.cpp
$(CXX) $(CFLAGS) -c stack-vm.cpp
clean:
rm -f *.o stack-vm
Спасибо за ваши ответы.