summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs31
1 files 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(&registers[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;