Unsigned short in assembler, fix sull'allocazione di memoria
This commit is contained in:
parent
9d1cadf7d4
commit
34d7d3c85f
@ -6,8 +6,8 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
std::ifstream f;
|
||||
std::streamsize fsize;
|
||||
std::ifstream bytecode_if;
|
||||
std::streamsize bytecode_size;
|
||||
uint8_t * bytecode;
|
||||
|
||||
if (argc < 2) {
|
||||
@ -18,14 +18,13 @@ int main(int argc, char *argv[]) {
|
||||
/*
|
||||
reading bytecode
|
||||
*/
|
||||
f.open(argv[1], std::ios::binary | std::ios::ate);
|
||||
fsize = f.tellg();
|
||||
f.seekg(0, std::ios::beg);
|
||||
bytecode_if.open(argv[1], std::ios::binary | std::ios::ate);
|
||||
bytecode_size = bytecode_if.tellg();
|
||||
bytecode_if.seekg(0, std::ios::beg);
|
||||
|
||||
bytecode = new uint8_t[fsize];
|
||||
f.read((char*)bytecode, fsize);
|
||||
|
||||
VM vm(bytecode, sizeof(bytecode));
|
||||
bytecode = new uint8_t[bytecode_size];
|
||||
bytecode_if.read((char*)bytecode, bytecode_size);
|
||||
VM vm(bytecode, bytecode_size);
|
||||
vm.run();
|
||||
vm.status();
|
||||
return 0;
|
||||
|
@ -36,22 +36,23 @@ assembled = bytearray()
|
||||
def to_uint8(data):
|
||||
alphanum = re.compile("^[0-9]+$")
|
||||
if isinstance(data, int):
|
||||
return struct.pack("<b", data)
|
||||
return struct.pack("<B", data)
|
||||
elif data.startswith("0x"):
|
||||
return struct.pack("<b", int(data, 16))
|
||||
return struct.pack("<B", int(data, 16))
|
||||
elif alphanum.match(data): # only numbers
|
||||
return struct.pack("<b", int(data))
|
||||
return struct.pack("<B", int(data))
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def to_uint16(data):
|
||||
alphanum = re.compile("^[0-9]+$")
|
||||
if isinstance(data, int):
|
||||
return struct.pack("<h", data)
|
||||
return struct.pack("<H", data)
|
||||
elif data.startswith("0x"):
|
||||
return struct.pack("<h", int(data, 16))
|
||||
return struct.pack("<H", int(data, 16))
|
||||
elif alphanum.match(data): # only numbers
|
||||
return struct.pack("<h", int(data))
|
||||
return struct.pack("<H", int(data))
|
||||
else:
|
||||
return None
|
||||
|
||||
@ -62,6 +63,25 @@ def is_reg(data):
|
||||
return True
|
||||
|
||||
|
||||
def movi(op, dst, src):
|
||||
global assembled
|
||||
if (is_reg(dst)):
|
||||
op_val = to_uint8(ops[op])
|
||||
dst_val = to_uint8(regs[dst])
|
||||
src_val = to_uint16(src)
|
||||
if op_val and dst_val and src_val:
|
||||
assembled += op_val + dst_val + src_val
|
||||
else:
|
||||
sys.stderr.write(
|
||||
"ERROR WHILE ASSEMBLING UNKNOWN VALUES\n")
|
||||
return False
|
||||
else:
|
||||
sys.stderr.write(
|
||||
"ERROR WHILE ASSEMBLING UNKNOWN REGISTER: {}\n".format(dst))
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def assemble_code(line):
|
||||
global assembled
|
||||
sys.stdout.write("CODE: ")
|
||||
@ -74,16 +94,7 @@ def assemble_code(line):
|
||||
return False
|
||||
sys.stdout.write("{} {}\n".format(op_name, ", ".join(instruction[1::])))
|
||||
if op_name == "MOVI":
|
||||
op = ops[op_name]
|
||||
dst = instruction[1]
|
||||
if (is_reg(dst)):
|
||||
dst = to_uint8(regs[dst])
|
||||
src = to_uint16(instruction[2])
|
||||
else:
|
||||
sys.stderr.write(
|
||||
"ERROR WHILE ASSEMBLING UNKNOWN REGISTER: {}\n".format(dst))
|
||||
return False
|
||||
assembled += to_uint8(op) + dst + src
|
||||
movi(op_name, instruction[1], instruction[2])
|
||||
return True
|
||||
|
||||
|
||||
@ -94,8 +105,13 @@ def assemble_data(line):
|
||||
|
||||
def main():
|
||||
global assembled
|
||||
with open("./test.gipu", 'r') as f:
|
||||
if (len(sys.argv) < 2):
|
||||
print("Usage: {} <file_to_assemble>".format(sys.argv[0]))
|
||||
return
|
||||
|
||||
with open(sys.argv[1], 'r') as f:
|
||||
gen = (line.strip("\n") for line in f if line != "\n")
|
||||
flag = None
|
||||
|
||||
for line in gen:
|
||||
if line.startswith(tuple(section_names)):
|
||||
@ -105,6 +121,8 @@ def main():
|
||||
assemble_data(line)
|
||||
elif flag == section_flags["CODE:"]:
|
||||
assemble_code(line)
|
||||
if not flag:
|
||||
sys.stderr.write("Nothing was assembled! Did you use the section delimiters?\n")
|
||||
with open("./out.gipu", 'wb') as f:
|
||||
f.write(assembled)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user