Website Summary Files Commits Branches @commit @diff @stats
path: root / assembler / src / parser / code_gen.rs
diff options
context:
space:
mode:
Commitcf56360e18a05da6c55148b2011fd22f8224bfef (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-02-14 00:26:44 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-02-14 00:26:44 +0200
Files20a362f38e83c95ed885a1c609248bca520c466c /assembler/src/parser/code_gen.rs
tonkobali-cf56360e18a05da6c55148b2011fd22f8224bfef.tar
tonkobali-cf56360e18a05da6c55148b2011fd22f8224bfef.tar.gz
tonkobali-cf56360e18a05da6c55148b2011fd22f8224bfef.zip
Parentaea15f0a2c265ea1afc04a227eff5cbfaef9c3a3 (diff)
fix(assembler): Fix instruction addressing
1 files changed, 2 insertions, 12 deletions
-rw-r--r--assembler/src/parser/code_gen.rs14
diff --git a/assembler/src/parser/code_gen.rs b/assembler/src/parser/code_gen.rs
index 4352e9e..92bf1d1 100644
--- a/assembler/src/parser/code_gen.rs
+++ b/assembler/src/parser/code_gen.rs
@@ -17,19 +17,9 @@ impl Program {
pub(crate) fn collapse_instructions(&mut self) {
let mut collapsed = Vec::new();
- let mut update_addrs = Vec::new();
for instr in &mut self.instructions {
- update_addrs.push(collapsed.len());
- collapsed.extend(instr.collapse());
- }
-
- for instr in &mut self.instructions {
- for arg in &mut instr.args {
- if let Address::Instruction(num) = arg {
- *arg = Address::Instruction(update_addrs[*num]);
- }
- }
+ collapsed.extend(instr.collapse(collapsed.len()));
}
self.instructions = collapsed;
@@ -45,7 +35,7 @@ impl Program {
self.constants.push(match arg {
Address::Memory(num) => *num,
Address::Constants(num) => absolute_start + *num,
- Address::Instruction(num) => constlen + absolute_start + *num,
+ Address::Instruction(num) => constlen + absolute_start + *num * 3,
_ => unreachable!("Definition addresses should've already been removed!"),
} as Word);
}