diff options
| Commit | ef23f004b131588e6c4a7c20d4f4fafb88292fb9 (patch) | |
|---|---|---|
| Author | 2025-02-13 23:06:51 +0200 | |
| Committer | 2025-02-13 23:06:51 +0200 | |
| Files | 65193b1f4eec511ac47ebc36fa24ed8cdd3073a3 /assembler/src | |
| tonkobali-ef23f004b131588e6c4a7c20d4f4fafb88292fb9.tar tonkobali-ef23f004b131588e6c4a7c20d4f4fafb88292fb9.tar.gz tonkobali-ef23f004b131588e6c4a7c20d4f4fafb88292fb9.zip | ||
| Parent | 0e5324f0b0cb01f624bd28ff5b8a646000d33c96 (diff) | |
feat(assembler): Generate data step
3 files changed, 30 insertions, 3 deletions
| -rw-r--r-- | assembler/src/lexer/mod.rs | 4 | ||||
| -rw-r--r-- | assembler/src/main.rs | 5 | ||||
| -rw-r--r-- | assembler/src/parser/code_gen.rs | 24 |
diff --git a/assembler/src/lexer/mod.rs b/assembler/src/lexer/mod.rs index 679df0f..b662242 100644 --- a/assembler/src/lexer/mod.rs +++ b/assembler/src/lexer/mod.rs @@ -59,7 +59,9 @@ pub fn split(mut line: String) -> Vec<Token> { }, ',' | '\n' | ';' => { buffer.pop(); - if buffer.is_empty() { continue; } + if buffer.is_empty() { + if c == ';' { break; } else { continue; } + } if let Some(num) = buffer.parse::<Word>().ok() { if address { diff --git a/assembler/src/main.rs b/assembler/src/main.rs index 0ec4d76..a282709 100644 --- a/assembler/src/main.rs +++ b/assembler/src/main.rs @@ -7,6 +7,7 @@ use std::io::{BufRead, BufReader}; use parser::Program; pub(crate) type Word = i64; +static PROGRAM_START: usize = 10; fn main() { let file_path = "./example.s"; @@ -30,7 +31,9 @@ fn main() { prog.remove_definition_addresses(); prog.collapse_instructions(); + println!("{:#?}", prog); /* Machine code gen */ - + prog.instructions_to_constants(PROGRAM_START); println!("{:#?}", prog); + } diff --git a/assembler/src/parser/code_gen.rs b/assembler/src/parser/code_gen.rs index dd1b872..77f2c2f 100644 --- a/assembler/src/parser/code_gen.rs +++ b/assembler/src/parser/code_gen.rs @@ -1,6 +1,9 @@ -use super::{ Program, Address, Instruction }; +use crate::Word; +use super::{ Program, Address }; impl Program { + /* Intermediate code generation */ + pub(crate) fn remove_definition_addresses(&mut self) { for instr in &mut self.instructions { for arg in &mut instr.args { @@ -9,6 +12,7 @@ impl Program { } } } + self.definitions.clear(); } pub(crate) fn collapse_instructions(&mut self) { @@ -30,4 +34,22 @@ impl Program { self.instructions = collapsed; } + + /* Machine code generation */ + + pub(crate) fn instructions_to_constants(&mut self, absolute_start: usize) { + let constlen = self.constants.len(); + + for instr in &mut self.instructions { + for arg in &mut instr.args { + self.constants.push(match arg { + Address::Memory(num) => *num, + Address::Constants(num) => absolute_start + *num, + Address::Instruction(num) => constlen + absolute_start + *num, + _ => unreachable!("Definition addresses should've already been removed!"), + } as Word); + } + } + self.instructions.clear(); + } } |
