Skip to content

Commit 3621c85

Browse files
Add bin/oct/hex literals
1 parent aaf9757 commit 3621c85

File tree

7 files changed

+46
-17
lines changed

7 files changed

+46
-17
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ name-ext/node_modules/*
2626
*.o
2727
!name-as/.artifacts/*
2828
name-fmt/node_modules/
29-
*.li
29+
name-as/*.li

name-as/.artifacts/mars_output.o

12 Bytes
Binary file not shown.

name-as/.artifacts/mips_test.asm

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
main:
2-
add $t1,$t2,$t3
2+
add $t0,$t2,$t3
33
sub $t4, $t5, $t6
44
sll $s0, $s0, 5
55
srl $s5, $s7, 10
66
xor $t7, $t8, $t9
77
lui $t0, 50
88
ori $t0, $t1, 50
9-
lb $t0, 50($t1)
9+
ori $t0, $t0, 0x50
10+
ori $t0, $t0, 050
11+
ori $t0, $t0, 0b1010
12+
lb $t0, 0x50($t1)
1013
beq $s0, $s0, test
1114
test:
1215
j test

name-as/.artifacts/mips_test.o

12 Bytes
Binary file not shown.

name-as/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ run-gnu: build
2525

2626
test: run
2727
$(CARGO) run -- $(GNUCFG) $(INPUT) gnu-$(OUTPUT)
28-
md5sum $(OUTPUT) gnu-$(OUTPUT)
28+
md5sum $(OUTPUT) .artifacts/mars_output.o gnu-$(OUTPUT)
2929

3030
clean:
3131
$(CARGO) clean

name-as/src/nma.rs

+36-12
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,24 @@ fn mask_u32(n: u32, x: u8) -> Result<u32, &'static str> {
2626
}
2727
}
2828

29+
fn base_parse(input: &str) -> Result<u32, &'static str> {
30+
if input.starts_with("0x") {
31+
// Hexadecimal
32+
u32::from_str_radix(&input[2..], 16).map_err(|_| "Failed to parse as hexadecimal")
33+
} else if input.starts_with("0b") {
34+
// Binary
35+
u32::from_str_radix(&input[2..], 2).map_err(|_| "Failed to parse as binary")
36+
} else if input.starts_with('0') && input.len() > 1 {
37+
// Octal
38+
u32::from_str_radix(&input[1..], 8).map_err(|_| "Failed to parse as octal")
39+
} else {
40+
// Decimal
41+
input
42+
.parse::<u32>()
43+
.map_err(|_| "Failed to parse as decimal")
44+
}
45+
}
46+
2947
const TEXT_ADDRESS_BASE: u32 = 0x400000;
3048
const MIPS_INSTR_BYTE_WIDTH: u32 = 4;
3149

@@ -281,8 +299,8 @@ fn assemble_r(r_struct: R, r_args: Vec<&str>) -> Result<u32, &'static str> {
281299
rd = assemble_reg(r_args[0])?;
282300
rs = 0;
283301
rt = assemble_reg(r_args[1])?;
284-
shamt = match r_args[2].parse::<u8>() {
285-
Ok(v) => v,
302+
shamt = match base_parse(r_args[2]) {
303+
Ok(v) => v as u8,
286304
Err(_) => return Err("Failed to parse shamt"),
287305
}
288306
}
@@ -345,16 +363,16 @@ fn assemble_i(
345363
enforce_length(&i_args, 2)?;
346364
rs = 0;
347365
rt = assemble_reg(i_args[0])?;
348-
imm = match i_args[1].parse::<u16>() {
349-
Ok(v) => v,
366+
imm = match base_parse(i_args[1]) {
367+
Ok(v) => v as u16,
350368
Err(_) => return Err("Failed to parse imm"),
351369
}
352370
}
353371
IForm::RtImmRs => {
354372
enforce_length(&i_args, 3)?;
355373
rt = assemble_reg(i_args[0])?;
356-
imm = match i_args[1].parse::<u16>() {
357-
Ok(v) => v,
374+
imm = match base_parse(i_args[1]) {
375+
Ok(v) => v as u16,
358376
Err(_) => return Err("Failed to parse imm"),
359377
};
360378
rs = assemble_reg(i_args[2])?;
@@ -373,8 +391,8 @@ fn assemble_i(
373391
enforce_length(&i_args, 3)?;
374392
rt = assemble_reg(i_args[0])?;
375393
rs = assemble_reg(i_args[1])?;
376-
imm = match i_args[2].parse::<u16>() {
377-
Ok(v) => v,
394+
imm = match base_parse(i_args[2]) {
395+
Ok(v) => v as u16,
378396
Err(_) => return Err("Failed to parse imm"),
379397
};
380398
}
@@ -533,8 +551,8 @@ pub fn assemble(program_arguments: &Args) -> Result<(), String> {
533551
if let Ok(instr_info) = r_operation(mnemonic) {
534552
println!("-----------------------------------");
535553
println!(
536-
"[R] {} - shamt [{:x}] - funct [{:x}]",
537-
mnemonic, instr_info.shamt, instr_info.funct
554+
"[R] {} - shamt [{:x}] - funct [{:x}] - args [{:?}]",
555+
mnemonic, instr_info.shamt, instr_info.funct, args
538556
);
539557
match assemble_r(instr_info, args) {
540558
Ok(assembled_r) => {
@@ -546,7 +564,10 @@ pub fn assemble(program_arguments: &Args) -> Result<(), String> {
546564
}
547565
} else if let Ok(instr_info) = i_operation(mnemonic) {
548566
println!("-----------------------------------");
549-
println!("[I] {} - opcode [{:x}]", mnemonic, instr_info.opcode);
567+
println!(
568+
"[I] {} - opcode [{:x}] - args [{:?}]",
569+
mnemonic, instr_info.opcode, args
570+
);
550571

551572
match assemble_i(instr_info, args, &labels, current_addr) {
552573
Ok(assembled_i) => {
@@ -558,7 +579,10 @@ pub fn assemble(program_arguments: &Args) -> Result<(), String> {
558579
}
559580
} else if let Ok(instr_info) = j_operation(mnemonic) {
560581
println!("-----------------------------------");
561-
println!("[J] {} - opcode [{:x}]", mnemonic, instr_info.opcode);
582+
println!(
583+
"[J] {} - opcode [{:x}] - args [{:?}]",
584+
mnemonic, instr_info.opcode, args
585+
);
562586

563587
match assemble_j(instr_info, args, &labels) {
564588
Ok(assembled_j) => {

name-as/src/parser.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ use pest_derive::Parser;
55
#[grammar_inline = r#"
66
alpha = _{ 'a'..'z' | 'A'..'Z' }
77
digit = _{ '0'..'9' }
8+
hex = _{ "0x" ~ (digit | 'a'..'f' | 'A'..'F')+ }
9+
binary = _{ "0b" ~ ('0'..'1')+ }
810
WHITESPACE = _{ " " | NEWLINE }
911
1012
ident = @{ alpha ~ (alpha | digit)* }
1113
1214
label = { ident ~ ":" }
1315
1416
register = @{ "$" ~ ident }
15-
instruction_arg = @{ ident | register | digit+ }
17+
instruction_arg = @{ ident | register | hex+ | binary+ | digit+ }
1618
standard_args = _{
1719
instruction_arg ~ ("," ~ WHITESPACE* ~ instruction_arg){, 2}
1820
}

0 commit comments

Comments
 (0)