Assemblaggio label corretto. BUGGATO A BESTIA

This commit is contained in:
Giulio De Pasquale 2017-05-19 12:23:18 +02:00
parent c24e2c791f
commit 07b9de5f2a
4 changed files with 68 additions and 13 deletions

View File

@ -310,10 +310,12 @@ class VMSection:
Represents a code section or "label" such as "main:"
"""
def __init__(self, name):
def __init__(self, name, line_start):
self.name = name
self.size = 0
self.offset = 0
self.line_start = line_start
self.line_end = 0
def set_size(self, size):
self.size = size
@ -321,8 +323,14 @@ class VMSection:
def set_offset(self, offset):
self.offset = offset
def set_line_start(self, start):
self.line_start = start
def set_line_end(self, end):
self.line_end = end
def __repr__(self):
return "{} | s: {}, o: {}".format(self.name, hex(self.size), hex(self.offset))
return "{} | ls: {}, le: {}, s: {}, o: {}".format(self.name, hex(self.line_start), hex(self.line_end), hex(self.size), hex(self.offset))
op_names = [["MOVI", "imm2reg"],
["MOVR", "reg2reg"],
@ -360,6 +368,7 @@ op_names = [["MOVI", "imm2reg"],
["JPER", "jump"],
["JPNI", "jump"],
["JPNR", "jump"],
["RETN", "single"],
["SHIT", "single"],
["NOPE", "single"],
["GRMN", "single"]]
@ -376,13 +385,29 @@ register_re = re.compile("(^[rRsS]{1}[0-9]{1}$)|([iIbBsS]{1}[pP]{1}$)")
def parse_sections(lines):
current_size = 0
current_section = None
# first parsing to get sections' names
for i, line in enumerate(lines):
if section_re.match(line):
if current_section:
tmp = next(x for x in sections if x.name == current_section)
tmp.set_line_end(i-1)
current_section = line.casefold()[:-1]
sections.append(VMSection(current_section, i + 1))
continue
#components = [x for x in re.split('\W', line) if x]
#instruction = VMInstruction(components[0], components[1:])
#current_size += instruction.size
tmp = next(x for x in sections if x.name == current_section)
tmp.set_line_end(i)
# calculating sizes and offsets
for line in lines:
if section_re.match(line):
if current_section:
tmp = next(x for x in sections if x.name == current_section)
tmp.set_size(current_size)
current_section = line.casefold()[:-1]
sections.append(VMSection(current_section))
current_size = 0
continue
components = [x for x in re.split('\W', line) if x]
@ -391,6 +416,12 @@ def parse_sections(lines):
tmp = next(x for x in sections if x.name == current_section)
tmp.set_size(current_size)
# if not, main as to be the first entry
for i in range(len(sections)):
if sections[i].name == "main" and i is not 0:
sections[0], sections[i] = sections[i], sections[0]
break
calc_section_offsets()
def calc_section_offsets():
current_offset = 0
@ -418,10 +449,9 @@ def main():
sys.stderr.write("No main specified!")
return
calc_section_offsets()
for line in filedata:
if not section_re.match(line):
for s in sections:
section_code = filedata[s.line_start:s.line_end+1]
for line in section_code:
vma.process_code_line(line)
with open(sys.argv[3], 'wb') as f:

View File

@ -38,6 +38,7 @@ enum OPS_STARTING_VALUES {
JPER,
JPNI,
JPNR,
RETN,
SHIT,
NOPE,
GRMN,
@ -96,6 +97,7 @@ INSTRUCTION SIZES
#define JPER_SIZE REGONLY
#define JPNI_SIZE IMMONLY
#define JPNR_SIZE REGONLY
#define RETN_SIZE SINGLE
#define SHIT_SIZE SINGLE
#define NOPE_SIZE SINGLE
#define GRMN_SIZE SINGLE

View File

@ -70,8 +70,8 @@ uint8_t *VM::getRegName(uint8_t regvalue) {
case IP:
memcpy(buf, "IP", 2);
break;
case BP:
memcpy(buf, "BP", 2);
case RP:
memcpy(buf, "RP", 2);
break;
case SP:
memcpy(buf, "SP", 2);
@ -118,8 +118,8 @@ void VM::status(void) {
case IP:
DBG_INFO(("IP:\t0x%x\n", this->regs[i]));
break;
case BP:
DBG_INFO(("BP:\t0x%x\n", this->regs[i]));
case RP:
DBG_INFO(("RP:\t0x%x\n", this->regs[i]));
break;
case SP:
DBG_INFO(("SP:\t0x%x\n", this->regs[i]));
@ -535,6 +535,7 @@ bool VM::execJMPI(void) {
imm = *(uint16_t *)&as.code[regs[IP] + 1];
DBG_INFO(("JMPI 0x%x\n", imm));
regs[RP] = regs[IP] + 3;
regs[IP] = imm;
return true;
}
@ -546,6 +547,7 @@ bool VM::execJMPR(void) {
reg = as.code[regs[IP] + 1];
DBG_INFO(("JMPR %s = 0x%x\n", getRegName(reg), regs[reg]));
regs[RP] = regs[IP] + 2;
regs[IP] = regs[reg];
return true;
}
@ -558,6 +560,7 @@ bool VM::execJPAI(void) {
imm = *(uint16_t *)&as.code[regs[IP] + 1];
DBG_INFO(("JPAI 0x%x\n", imm));
if (flags.CF == 1) {
regs[RP] = regs[IP] + 2;
regs[IP] = imm;
return true;
}
@ -572,6 +575,7 @@ bool VM::execJPAR(void) {
reg = as.code[regs[IP] + 1];
DBG_INFO(("JPAR %s = 0x%x\n", getRegName(reg), regs[reg]));
if (flags.CF == 1) {
regs[RP] = regs[IP] + 2;
regs[IP] = reg;
return true;
}
@ -586,9 +590,12 @@ bool VM::execJPBI(void) {
imm = *(uint16_t *)&as.code[regs[IP] + 1];
DBG_INFO(("JPBI 0x%x\n", imm));
if (flags.CF == 0) {
regs[RP] = regs[IP] + 3;
printf("IP: 0x%x | RP: 0x%x\n", regs[IP], regs[RP]);
regs[IP] = imm;
return true;
}
printf("YO");
return false;
}
bool VM::execJPBR(void) {
@ -600,6 +607,7 @@ bool VM::execJPBR(void) {
reg = as.code[regs[IP] + 1];
DBG_INFO(("JPBR %s = 0x%x\n", getRegName(reg), regs[reg]));
if (flags.CF == 0) {
regs[RP] = regs[IP] + 2;
regs[IP] = reg;
return true;
}
@ -614,6 +622,7 @@ bool VM::execJPEI(void) {
imm = *(uint16_t *)&as.code[regs[IP] + 1];
DBG_INFO(("JPEI 0x%x\n", imm));
if (flags.ZF == 1) {
regs[RP] = regs[IP] + 2;
regs[IP] = imm;
return true;
}
@ -628,6 +637,7 @@ bool VM::execJPER(void) {
reg = as.code[regs[IP] + 1];
DBG_INFO(("JPER %s = 0x%x\n", getRegName(reg), regs[reg]));
if (flags.ZF == 1) {
regs[RP] = regs[IP] + 2;
regs[IP] = reg;
return true;
}
@ -642,6 +652,7 @@ bool VM::execJPNI(void) {
imm = *(uint16_t *)&as.code[regs[IP] + 1];
DBG_INFO(("JPNI 0x%x\n", imm));
if (flags.ZF == 0) {
regs[RP] = regs[IP] + 2;
regs[IP] = imm;
return true;
}
@ -656,11 +667,19 @@ bool VM::execJPNR(void) {
reg = as.code[regs[IP] + 1];
DBG_INFO(("JPNR %s = 0x%x\n", getRegName(reg), regs[reg]));
if (flags.ZF == 0) {
regs[RP] = regs[IP] + 2;
regs[IP] = reg;
return true;
}
return false;
}
bool VM::execRETN(void) {
/*
RETN -> IP = RP , restores saved return IP
*/
DBG_INFO(("RETN 0x%x\n", regs[RP]));
return true;
}
bool VM::execGRMN(void) {
uint8_t i;
for (i = 0; i < NUM_REGS; i++) {
@ -784,6 +803,9 @@ void VM::run(void) {
if (!execJPNR()) {
regs[IP] += JPNR_SIZE;
}
} else if (opcode == OPS[RETN]) {
execRETN();
regs[IP] = regs[RP];
} else if (opcode == OPS[GRMN]) {
execGRMN();
regs[IP] += GRMN_SIZE;

View File

@ -3,7 +3,7 @@
#include "vmas.h"
#include <stdint.h>
enum regs { R0, R1, R2, R3, S0, S1, S2, S3, IP, BP, SP, NUM_REGS };
enum regs { R0, R1, R2, R3, S0, S1, S2, S3, IP, RP, SP, NUM_REGS };
typedef struct flags {
uint8_t ZF : 1;
uint8_t CF : 1;
@ -68,6 +68,7 @@ private:
bool execJPER(void);
bool execJPNI(void);
bool execJPNR(void);
bool execRETN(void);
bool execGRMN(void);
public: