diff options
Diffstat (limited to 'src/assembler.rs')
| -rw-r--r-- | src/assembler.rs | 18 |
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); } |
