From 1ecb2d5380a88b2940d9eb23054e5b5fba0d49e0 Mon Sep 17 00:00:00 2001 From: Emmett Brown Date: Sat, 16 Oct 2021 03:19:16 +0200 Subject: [PATCH] partial #115: increment address within asm blocks --- src/asm/state.rs | 8 +++++++- tests/issue115/1.asm | 21 +++++++++++++++++++++ tests/issue115/2.asm | 27 +++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/issue115/1.asm create mode 100644 tests/issue115/2.asm diff --git a/src/asm/state.rs b/src/asm/state.rs index c21daf65..8373dd5d 100644 --- a/src/asm/state.rs +++ b/src/asm/state.rs @@ -1330,6 +1330,10 @@ impl State fileserver: &dyn util::FileServer) -> Result { + // Clone the context in order to advance the logical address + // between instructions. + let mut inner_ctx = ctx.clone(); + let mut result = util::BigInt::new(0, Some(0)); let mut parser = syntax::Parser::new(Some(info.report.clone()), info.tokens); @@ -1386,7 +1390,7 @@ impl State let matches = asm::parser::match_rule_invocation( &self, subparser, - ctx.clone(), + inner_ctx.clone(), fileserver, info.report.clone())?; @@ -1440,6 +1444,8 @@ impl State &bigint, (size, 0)); } + + inner_ctx.bit_offset += size; } parser.expect_linebreak()?; diff --git a/tests/issue115/1.asm b/tests/issue115/1.asm new file mode 100644 index 00000000..c1b28c74 --- /dev/null +++ b/tests/issue115/1.asm @@ -0,0 +1,21 @@ +#bits 4 + +#ruledef +{ + jmp {addr: u4} => addr + + asmjmp {addr: u4} => asm + { + jmp addr + } + + op => asm + { + jmp $ + asmjmp $ + jmp $ + } +} + +op ; = 0x012 +op ; = 0x345 \ No newline at end of file diff --git a/tests/issue115/2.asm b/tests/issue115/2.asm new file mode 100644 index 00000000..44bf5b71 --- /dev/null +++ b/tests/issue115/2.asm @@ -0,0 +1,27 @@ +#bits 4 + +#ruledef +{ + jmp {addr: u4} => addr + + asmjmp {addr: u4} => asm + { + jmp addr + jmp $ + } + + op => asm + { + jmp $ + asmjmp $ + jmp $ + } +} + +op ; = 0x0123 +#d asm +{ + op ; = 0x4567 + op ; = 0x89ab +} +op ; = 0xcdef \ No newline at end of file