Website Summary Files Commits Branches @commit @diff @stats
path: root / assembler / src / parser / code_gen.rs
diff options
context:
space:
mode:
1 files changed, 16 insertions, 0 deletions
-rw-r--r--assembler/src/parser/code_gen.rs16
diff --git a/assembler/src/parser/code_gen.rs b/assembler/src/parser/code_gen.rs
index 74a4fad..1c5b95a 100644
--- a/assembler/src/parser/code_gen.rs
+++ b/assembler/src/parser/code_gen.rs
@@ -5,6 +5,22 @@ impl Program {
/* Intermediate code generation */
pub(crate) fn collapse_instructions(&mut self) {
+ // Fix instruction addresses
+ let mut offsets = Vec::new();
+ for instr in &self.instructions {
+ offsets.push(instr.collapse_len() + offsets.last().unwrap_or(&0));
+ }
+ offsets.insert(0, 0);
+
+ for instr in &mut self.instructions {
+ for arg in &mut instr.args {
+ if let Address::Instruction(num) = arg {
+ *arg = Address::Instruction(offsets[*num]);
+ }
+ }
+ }
+
+ // Collapse all instructions
let mut collapsed = Vec::new();
for instr in &mut self.instructions {