bfin/src/asm_gen.rs

74 lines
1.7 KiB
Rust
Raw Normal View History

use crate::tokenizer::{Token, TokenType};
pub fn generate(tokens: Vec<Token>) -> String {
let mut output = String::new();
output.push_str(
"section .bss\n\
2024-10-22 14:12:01 +03:00
data: resb 65536\n",
);
// global start label
output.push_str(
"global _start\n\
section .text\n\
_start:\n",
);
2024-10-22 14:12:01 +03:00
// create the pointer for var
output.push_str("mov rdx, data\n");
// NOTE: For debugging only
2024-10-22 14:12:01 +03:00
// output.push_str("mov byte[rdx], 48\n");
for token in tokens {
match token.r#type {
TokenType::Plus(x) => {
2024-10-22 14:12:01 +03:00
output.push_str(&format!("add byte[rdx], {x}\n"));
}
TokenType::Minus(x) => {
2024-10-22 14:12:01 +03:00
output.push_str(&format!("sub byte[rdx], {x}\n"));
}
TokenType::MoveRight(x) => {
output.push_str(&format!("add rdx, {x}\n"));
}
TokenType::MoveLeft(x) => {
output.push_str(&format!("sub rdx, {x}\n"));
}
TokenType::Output => {
output.push_str(
"push rdx\n\
mov rax, 1\n\
mov rdi, 1\n\
2024-10-22 14:12:01 +03:00
mov rsi, rdx\n\
mov rdx, 1\n\
syscall\n\
pop rdx\n",
);
}
TokenType::Input => {
output.push_str(
"push rdx\n\
mov rax, 0\n\
mov rdi, 0\n\
mov rsi, rdx\n\
mov rdx, 1\n\
syscall\n\
pop rdx\n",
);
}
TokenType::BracketOpen => todo!(),
TokenType::BracketClose => todo!(),
}
}
// exit syscall
output.push_str(
"mov rax, 60\n\
mov rdi, 0\n\
syscall\n",
);
output
}