From 32bdfd563dbcb262e5417bbb5a2afccbd15b803b Mon Sep 17 00:00:00 2001 From: Nathan Lee Date: Wed, 3 Jun 2026 20:36:08 -0500 Subject: finish S and I type RV32I instructions --- src/main.rs | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main.rs b/src/main.rs index 77685a4..8aacb63 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,10 +44,6 @@ fn main() { if let Ok(sh_name) = str_tab.get(header.sh_name as usize) && sh_name == ".text" { - let (sh_data, _) = elf - .section_data(&header) - .expect("Unable to get section data"); - pc = header.sh_addr as u32; } } @@ -163,10 +159,12 @@ fn handle_instruction(memory: &mut [u8], registers: &mut [u32], pc: u32) { let number: u32 = slice.iter().fold(0u32, |acc, &n| (acc << 8) | n as u32); registers[rd] = number; // lw } - 4 => { - println!("lbu {} {} {}", ABI[rd], ABI[rs1], imm & 0xFF); - } - 5 => println!("lhu {} {} {}", ABI[rd], ABI[rs1], imm & 0xFFFF), + 4 => registers[rd] = memory[(registers[rs1] + imm) as usize] as u32, // lbu + 5 => { + let low = memory[(registers[rs1] + imm) as usize]; + let high = memory[(registers[rs1] + imm + 1) as usize]; + registers[rd] = ((high as u16) << 8 | low as u16) as u32; // lhu + }, _ => panic!("Illegal instruction: {:x}", word), } } @@ -180,9 +178,17 @@ fn handle_instruction(memory: &mut [u8], registers: &mut [u32], pc: u32) { let imm = (imm_high << 5) | imm_low; match f3 { - 0 => println!("sb {} {} {}", ABI[rs1], ABI[rs2], imm & 0xFF), - 1 => println!("sh {} {} {}", ABI[rs1], ABI[rs2], imm & 0xFFFF), - 2 => println!("sw {} {} {}", ABI[rs1], ABI[rs2], imm & 0xFFFFFF), + 0 => memory[(registers[rs1] + imm) as usize] = registers[rs2] as u8, // sb + 1 => { + let halfword = registers[rs2] & 0xFFFF; + let index = (registers[rs1] + imm) as usize; + memory[index] = (halfword & 0xFF) as u8; + memory[index + 1] = (halfword >> 8) as u8; + }, // sh + 2 => { + let index = (registers[rs1] + imm) as usize; + memory[index..index + 4].copy_from_slice(®isters[rs2].to_le_bytes()); // sw + }, _ => panic!("Illegal instruction: {:x}", word), }; } @@ -192,8 +198,7 @@ fn handle_instruction(memory: &mut [u8], registers: &mut [u32], pc: u32) { 0b0110111 => { let imm = word >> 12; let rd = ((word >> 7) & 0b11111) as usize; - println!("lui {} {}", rd, imm as i32); - registers[rd] = imm << 12; + registers[rd] = imm << 12; // lui } 0b0010111 => { let imm = word >> 12; -- cgit v1.2.3