Did some work :p.

This commit is contained in:
Goren Barak 2023-11-28 19:20:05 -05:00
parent 1016345107
commit fb098123d5
2 changed files with 18 additions and 18 deletions

View file

@ -8,19 +8,12 @@ macro_rules! fasm_codegen {
fasm_codegen($exprs, true) fasm_codegen($exprs, true)
}; };
(fun: $exprs:expr) => { (function: $exprs:expr) => {
fasm_codegen($exprs, false) fasm_codegen($exprs, false)
} }
} }
pub fn temp(counter: u64) -> String {
format!("tmp{:?}", counter)
}
pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String { pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String {
// A counter for how many temporary variables have been created. This is used to create new ones. The new ones will be called tmp1, tmp2, etc.
let mut tmp_counter: u64 = 0;
// Define asm_func, used for functions. // Define asm_func, used for functions.
let mut asm_func = String::new(); let mut asm_func = String::new();
// Define asm_data, used for variables. // Define asm_data, used for variables.
@ -30,7 +23,7 @@ pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String {
macro_rules! unwrap { macro_rules! unwrap {
($item:expr) => { ($item:expr) => {
asm_start.push_str(fasm_codegen!(fun: &vec![*$item.as_ref()]).as_str());- asm_start.push_str(fasm_codegen!(fun: &vec![*$item.as_ref()]).as_str());
} }
} }
@ -166,7 +159,6 @@ pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String {
Expr::Breakpoint => { Expr::Breakpoint => {
// Write the interrupt for a debugger breakpoint. // Write the interrupt for a debugger breakpoint.
asm_start.push_str("\tint3\n"); asm_start.push_str("\tint3\n");
asm_start.push_str("\txor rax, rax\n");
}, },
// Return something from a function. // Return something from a function.
@ -174,8 +166,7 @@ pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String {
// Do the operation that should later be returned. // Do the operation that should later be returned.
asm_start.push_str(fasm_codegen!(fun: &e).as_str()); asm_start.push_str(fasm_codegen!(fun: &e).as_str());
// Move the return value to rbp + 8. // Move the return value to rbp + 8.
asm_start.push_str("mov [rbp + 8], rax"); // [rbp + 8] ← return_value
// 8(%rbp) ← return_value
}, },
// A function defenition. // A function defenition.
@ -183,7 +174,7 @@ pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String {
// In x86-64 assembly, a function is defined as <function_name>:. Push this to the `asm_func`. // In x86-64 assembly, a function is defined as <function_name>:. Push this to the `asm_func`.
asm_func.push_str(format!("{}:\n", e.name).as_str()); asm_func.push_str(format!("{}:\n", e.name).as_str());
// Call the function itself specifying that you are defining a function, and push the returned value to `asm_func`. // Call the function itself specifying that you are defining a function, and push the returned value to `asm_func`.
asm_func.push_str(fasm_codegen!(fun: &e.contents).as_str()); asm_func.push_str(fasm_codegen!(function: &e.contents).as_str());
// Use the ret instruction to return from the procedure. // Use the ret instruction to return from the procedure.
asm_func.push_str("\tret\n"); asm_func.push_str("\tret\n");
}, },
@ -213,7 +204,6 @@ pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String {
asm_func.push_str("\tret\n"); asm_func.push_str("\tret\n");
} }
_ => unsafe { _ => unsafe {
// Write some data I randomly typed to your memory because don't going around playing with something that I haven't implemented yet. // Write some data I randomly typed to your memory because don't going around playing with something that I haven't implemented yet.
let mut ptr = 0x00 as *mut f64; let mut ptr = 0x00 as *mut f64;
@ -221,7 +211,6 @@ pub fn fasm_codegen(exprs: &Vec<Expr>, not_a_function: bool) -> String {
}, },
} }
} }

View file

@ -1,5 +1,3 @@
use std::rc::Rc;
#[derive(Debug)] #[derive(Debug)]
pub enum Expr<'a> { pub enum Expr<'a> {
MathExpr(Math<'a>), MathExpr(Math<'a>),
@ -80,11 +78,24 @@ pub struct ParamReference {
// CONDITIONS // CONDITIONS
#[derive(Debug)] #[derive(Debug)]
<<<<<<< HEAD
pub struct IfCondition<'a> { pub struct IfCondition<'a> {
pub left: Expr<'a>, pub left: Expr<'a>,
pub right: Expr<'a>, pub right: Expr<'a>,
pub cond: COND_OP, pub cond: COND_OP,
pub action: Vec<Expr<'a>> pub action: Vec<Expr<'a>>
=======
pub struct IfStatement<'a> {
pub condition: Condition<'a>,
pub if_true: Vec<Expr<'a>>,
}
#[derive(Debug)]
pub struct Condition<'a> {
pub left: Value<'a>,
pub right: Value<'a>,
pub between: COND_OP,
>>>>>>> parent of 2f942d3 (Added if statements, and made `Expr::Return` work.)
} }
#[derive(Debug)] #[derive(Debug)]