From 133f6f748dd8d687273d991a134fad1c455ef99c Mon Sep 17 00:00:00 2001 From: krolxon Date: Thu, 8 Jan 2026 19:02:18 +0530 Subject: add CALL, RET --- src/assembler.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/assembler.rs') diff --git a/src/assembler.rs b/src/assembler.rs index 1b9c85b..73dec00 100644 --- a/src/assembler.rs +++ b/src/assembler.rs @@ -25,8 +25,8 @@ fn is_reg(s: &str) -> bool { fn instr_size(tokens: &[String]) -> u16 { match tokens[0].as_str() { - "mov" | "add" | "sub" | "jmp" | "jz" | "jnz" | "cmp" | "mul" | "div" => 3, - "hlt" => 1, + "mov" | "add" | "sub" | "jmp" | "jz" | "jnz" | "cmp" | "mul" | "div" | "call" => 3, + "hlt" | "ret" => 1, _ => panic!("Unknown instruction {}", tokens[0]), } } @@ -172,6 +172,20 @@ pub fn assembler(source: &str) -> Vec { bytes.push(r2); } + "call" => { + let addr = *symbols + .get(&tokens[1]) + .expect("Unknown label"); + + bytes.push(Instruction::CALL as u8); + bytes.push((addr & 0xFF) as u8); // low + bytes.push((addr >> 8) as u8); // high + } + + "ret" => { + bytes.push(Instruction::RET as u8); + } + "hlt" => { bytes.push(Instruction::HLT as u8); } -- cgit v1.2.3