Added Equals '='
This commit is contained in:
parent
e053d7bef3
commit
f2b45e343c
67
a.nasm
67
a.nasm
|
@ -1,67 +0,0 @@
|
|||
global _start
|
||||
segment .text
|
||||
print:
|
||||
mov r9, -3689348814741910323
|
||||
sub rsp, 40
|
||||
mov BYTE [rsp+31], 10
|
||||
lea rcx, [rsp+30]
|
||||
.L2:
|
||||
mov rax, rdi
|
||||
lea r8, [rsp+32]
|
||||
mul r9
|
||||
mov rax, rdi
|
||||
sub r8, rcx
|
||||
shr rdx, 3
|
||||
lea rsi, [rdx+rdx*4]
|
||||
add rsi, rsi
|
||||
sub rax, rsi
|
||||
add eax, 48
|
||||
mov BYTE [rcx], al
|
||||
mov rax, rdi
|
||||
mov rdi, rdx
|
||||
mov rdx, rcx
|
||||
sub rcx, 1
|
||||
cmp rax, 9
|
||||
ja .L2
|
||||
lea rax, [rsp+32]
|
||||
mov edi, 1
|
||||
sub rdx, rax
|
||||
xor eax, eax
|
||||
lea rsi, [rsp+32+rdx]
|
||||
mov rdx, r8
|
||||
mov rax, 1
|
||||
syscall
|
||||
add rsp, 40
|
||||
ret
|
||||
_start:
|
||||
; -- PUSH 35
|
||||
mov rax, 35
|
||||
push rax
|
||||
; -- PUSH 34
|
||||
mov rax, 34
|
||||
push rax
|
||||
; -- PLUS
|
||||
pop rax
|
||||
pop rbx
|
||||
add rax, rbx
|
||||
push rax
|
||||
; -- PRINT
|
||||
pop rdi
|
||||
call print
|
||||
; -- PUSH 500
|
||||
mov rax, 500
|
||||
push rax
|
||||
; -- PUSH 80
|
||||
mov rax, 80
|
||||
push rax
|
||||
; -- MINUS
|
||||
pop rax
|
||||
pop rbx
|
||||
sub rbx, rax
|
||||
push rbx
|
||||
; -- PRINT
|
||||
pop rdi
|
||||
call print
|
||||
mov rax, 60
|
||||
mov rdi, 0
|
||||
syscall
|
|
@ -81,6 +81,17 @@ pub fn compile(tokens: Vec<Operator>, args: Args) -> Result<()>{
|
|||
writeln!(writer, " sub rbx, rax")?;
|
||||
writeln!(writer, " push rbx")?;
|
||||
},
|
||||
OpType::Equals => {
|
||||
writeln!(writer, " ; -- EQUALS")?;
|
||||
writeln!(writer, " mov rcx, 0")?;
|
||||
writeln!(writer, " mov rdx, 1")?;
|
||||
writeln!(writer, " pop rax")?;
|
||||
writeln!(writer, " pop rbx")?;
|
||||
writeln!(writer, " cmp rax, rbx")?;
|
||||
writeln!(writer, " cmove rcx, rdx")?;
|
||||
writeln!(writer, " push rcx")?;
|
||||
|
||||
},
|
||||
OpType::Print => {
|
||||
writeln!(writer, " ; -- PRINT")?;
|
||||
writeln!(writer, " pop rdi")?;
|
||||
|
|
|
@ -5,9 +5,16 @@ pub enum OpType {
|
|||
Pop,
|
||||
Minus,
|
||||
Plus,
|
||||
Equals,
|
||||
Print
|
||||
}
|
||||
|
||||
|
||||
// #[derive(Debug)]
|
||||
// pub enum OpType {
|
||||
|
||||
// }
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Operator {
|
||||
pub typ: OpType,
|
||||
|
|
|
@ -30,6 +30,13 @@ pub fn run(tokens: Vec<crate::constants::Operator>) -> Result<(), &'static str>{
|
|||
let b = stack_pop(&mut stack)?;
|
||||
stack.push(b - a);
|
||||
},
|
||||
OpType::Equals => {
|
||||
let a = stack_pop(&mut stack)?;
|
||||
let b = stack_pop(&mut stack)?;
|
||||
stack.push((a == b) as i32);
|
||||
|
||||
},
|
||||
|
||||
OpType::Print => {
|
||||
let a = stack_pop(&mut stack)?;
|
||||
println!("{a}");
|
||||
|
|
|
@ -23,11 +23,12 @@ impl Parser {
|
|||
let num = t.parse::<i32>().unwrap();
|
||||
tokens.push(Operator::new(OpType::Push, num));
|
||||
},
|
||||
|
||||
|
||||
"pop" => tokens.push(Operator::new(OpType::Pop, 0)),
|
||||
"+" => tokens.push(Operator::new(OpType::Plus, 0)),
|
||||
"-" => tokens.push(Operator::new(OpType::Minus, 0)),
|
||||
"print" => tokens.push(Operator::new(OpType::Print, 0)),
|
||||
"=" => tokens.push(Operator::new(OpType::Equals, 0)),
|
||||
|
||||
|
||||
t => {
|
||||
|
|
BIN
x86_64-intel-manual.pdf
Normal file
BIN
x86_64-intel-manual.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user