From 7504b81b2d93240de80c6f68861d87df46466fd8 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Mon, 10 Feb 2020 18:02:44 -0500 Subject: [PATCH] Require assembler sections to specify where in virtual memory they begin Signed-off-by: Alek Ratzloff --- src/main.rs | 11 +++++------ src/vm/obj/assemble/mod.rs | 13 ++++++------- src/vm/obj/syn/ast.rs | 4 ++-- src/vm/obj/syn/parser.lalrpop | 4 ++-- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index c7230c8..fc8bab5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,6 +31,7 @@ fn main() -> Result<()> { } }; let obj = vm::obj::obj::Object::try_from(&ast)?; + //dump(&obj)?; let mut vm = vm::vm::Vm::new(); vm.load_object(obj, 1024 * 1024 * 64)?; // 64mb let status = vm.run()?; @@ -39,23 +40,21 @@ fn main() -> Result<()> { } - /* -fn dump(obj: &Object) { +fn dump(obj: &vm::obj::obj::Object) -> Result<()> { use vm::obj::obj::Section; use vm::visit::VisitInst; let mut stdout = io::stdout(); for section in &obj.sections { let mut disasm = match section { - Section::Code { start, contents, .. } - | Section::Data { start, contents, .. } => { + Section::Code { start, contents, .. } => { vm::disassemble::Disassemble::new(&mut stdout, contents, *start) } - Section::Meta { .. } => continue, + Section::Meta { .. } | Section::Data { .. } => continue, }; while !disasm.is_done() { disasm.visit_inst()?; } println!(); } + Ok(()) } - */ diff --git a/src/vm/obj/assemble/mod.rs b/src/vm/obj/assemble/mod.rs index 9532c45..cb73def 100644 --- a/src/vm/obj/assemble/mod.rs +++ b/src/vm/obj/assemble/mod.rs @@ -38,7 +38,6 @@ impl<'a> Assemble<'a> { } pub fn assemble(&mut self) -> Result { - let mut pos = 0; let mut sections = Vec::new(); // gather global symbols @@ -78,11 +77,9 @@ impl<'a> Assemble<'a> { } } let (start, end) = match org { - Some(SectionOrg::Start(start)) => (*start, start + bytes.len() as u64), - Some(SectionOrg::Range(start, end)) => (*start, *end), - None => (pos, pos + bytes.len() as u64), + SectionOrg::Start(start) => (*start, start + bytes.len() as u64), + SectionOrg::Range(start, end) => (*start, *end), }; - pos = end; let section = match block { SectionBlock::Data { .. } => Section::Data { @@ -121,10 +118,12 @@ impl<'a> Assemble<'a> { fn gather_symbols(block: &SectionBlock, export: bool) -> Result> { match block { - SectionBlock::Data { body, .. } | SectionBlock::Code { body, .. } => { + SectionBlock::Data { org, body, .. } | SectionBlock::Code { org, body, .. } => { let mut exports = HashSet::new(); let mut labels = HashMap::new(); - let mut pos = 0; + let mut pos = match org { + SectionOrg::Start(start) | SectionOrg::Range(start, _) => (*start) as usize, + }; for line in body.iter() { match line { Line::Inst(inst) => { diff --git a/src/vm/obj/syn/ast.rs b/src/vm/obj/syn/ast.rs index e6709d4..fe09b44 100644 --- a/src/vm/obj/syn/ast.rs +++ b/src/vm/obj/syn/ast.rs @@ -3,11 +3,11 @@ use crate::vm::{inst::*, reg::Reg}; #[derive(Debug, Clone, PartialEq, Eq)] pub enum SectionBlock { Data { - org: Option, + org: SectionOrg, body: Vec, }, Code { - org: Option, + org: SectionOrg, body: Vec, }, Meta { diff --git a/src/vm/obj/syn/parser.lalrpop b/src/vm/obj/syn/parser.lalrpop index 76fcd95..c3de298 100644 --- a/src/vm/obj/syn/parser.lalrpop +++ b/src/vm/obj/syn/parser.lalrpop @@ -82,11 +82,11 @@ SectionOrg: SectionOrg = { } Section: SectionBlock = { - "data" "{" "}" => { + "data" "{" "}" => { SectionBlock::Data { org, body } }, - "code" "{" "}" => { + "code" "{" "}" => { SectionBlock::Code { org, body } },