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