aboutsummaryrefslogtreecommitdiff
path: root/src/assembler.rs
diff options
context:
space:
mode:
authorkrolxon <krolyxon@tutanota.com>2026-01-08 19:02:18 +0530
committerkrolxon <krolyxon@tutanota.com>2026-01-08 19:02:18 +0530
commit133f6f748dd8d687273d991a134fad1c455ef99c (patch)
tree48817f643e8555a161ec88ab505a8354798920cf /src/assembler.rs
parent3372e774e9505acdc3778a8155476cca4bfbd3e8 (diff)
add CALL, RET
Diffstat (limited to 'src/assembler.rs')
-rw-r--r--src/assembler.rs18
1 files changed, 16 insertions, 2 deletions
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<u8> {
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);
}