Website Summary Files Commits Branches @commit @diff @stats
path: root / assembler / src
diff options
context:
space:
mode:
Commitef23f004b131588e6c4a7c20d4f4fafb88292fb9 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-02-13 23:06:51 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-02-13 23:06:51 +0200
Files65193b1f4eec511ac47ebc36fa24ed8cdd3073a3 /assembler/src
tonkobali-ef23f004b131588e6c4a7c20d4f4fafb88292fb9.tar
tonkobali-ef23f004b131588e6c4a7c20d4f4fafb88292fb9.tar.gz
tonkobali-ef23f004b131588e6c4a7c20d4f4fafb88292fb9.zip
Parent0e5324f0b0cb01f624bd28ff5b8a646000d33c96 (diff)
feat(assembler): Generate data step
3 files changed, 30 insertions, 3 deletions
-rw-r--r--assembler/src/lexer/mod.rs4
-rw-r--r--assembler/src/main.rs5
-rw-r--r--assembler/src/parser/code_gen.rs24
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();
+ }
}