@@ -26,6 +26,24 @@ fn mask_u32(n: u32, x: u8) -> Result<u32, &'static str> {
26
26
}
27
27
}
28
28
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
+
29
47
const TEXT_ADDRESS_BASE : u32 = 0x400000 ;
30
48
const MIPS_INSTR_BYTE_WIDTH : u32 = 4 ;
31
49
@@ -281,8 +299,8 @@ fn assemble_r(r_struct: R, r_args: Vec<&str>) -> Result<u32, &'static str> {
281
299
rd = assemble_reg ( r_args[ 0 ] ) ?;
282
300
rs = 0 ;
283
301
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 ,
286
304
Err ( _) => return Err ( "Failed to parse shamt" ) ,
287
305
}
288
306
}
@@ -345,16 +363,16 @@ fn assemble_i(
345
363
enforce_length ( & i_args, 2 ) ?;
346
364
rs = 0 ;
347
365
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 ,
350
368
Err ( _) => return Err ( "Failed to parse imm" ) ,
351
369
}
352
370
}
353
371
IForm :: RtImmRs => {
354
372
enforce_length ( & i_args, 3 ) ?;
355
373
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 ,
358
376
Err ( _) => return Err ( "Failed to parse imm" ) ,
359
377
} ;
360
378
rs = assemble_reg ( i_args[ 2 ] ) ?;
@@ -373,8 +391,8 @@ fn assemble_i(
373
391
enforce_length ( & i_args, 3 ) ?;
374
392
rt = assemble_reg ( i_args[ 0 ] ) ?;
375
393
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 ,
378
396
Err ( _) => return Err ( "Failed to parse imm" ) ,
379
397
} ;
380
398
}
@@ -533,8 +551,8 @@ pub fn assemble(program_arguments: &Args) -> Result<(), String> {
533
551
if let Ok ( instr_info) = r_operation ( mnemonic) {
534
552
println ! ( "-----------------------------------" ) ;
535
553
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
538
556
) ;
539
557
match assemble_r ( instr_info, args) {
540
558
Ok ( assembled_r) => {
@@ -546,7 +564,10 @@ pub fn assemble(program_arguments: &Args) -> Result<(), String> {
546
564
}
547
565
} else if let Ok ( instr_info) = i_operation ( mnemonic) {
548
566
println ! ( "-----------------------------------" ) ;
549
- println ! ( "[I] {} - opcode [{:x}]" , mnemonic, instr_info. opcode) ;
567
+ println ! (
568
+ "[I] {} - opcode [{:x}] - args [{:?}]" ,
569
+ mnemonic, instr_info. opcode, args
570
+ ) ;
550
571
551
572
match assemble_i ( instr_info, args, & labels, current_addr) {
552
573
Ok ( assembled_i) => {
@@ -558,7 +579,10 @@ pub fn assemble(program_arguments: &Args) -> Result<(), String> {
558
579
}
559
580
} else if let Ok ( instr_info) = j_operation ( mnemonic) {
560
581
println ! ( "-----------------------------------" ) ;
561
- println ! ( "[J] {} - opcode [{:x}]" , mnemonic, instr_info. opcode) ;
582
+ println ! (
583
+ "[J] {} - opcode [{:x}] - args [{:?}]" ,
584
+ mnemonic, instr_info. opcode, args
585
+ ) ;
562
586
563
587
match assemble_j ( instr_info, args, & labels) {
564
588
Ok ( assembled_j) => {
0 commit comments