### isdigit(c) .text isdigit: li $v0, 0 blt $a0, 0x30, Lisdigit_end # $a0 < '0' then return false bgt $a0, 0x39, Lisdigit_end # $a0 > '9' then return false li $v0, 1 # return true Lisdigit_end: jr $ra ### getc() .data Sgetc_c: .asciiz " " .text getc: la $a0, Sgetc_c li $a1, 2 li $v0, 8 syscall la $t0, Sgetc_c lb $v0, ($t0) jr $ra ### read_int(first) .text read_int: move $s7, $ra # return address in $s7 sub $s0, $a0, 0x30 Lread_int_loop: jal getc sub $s1, $v0, 0x30 move $a0, $v0 jal isdigit move $v1, $v0 beqz $v0, Lread_int_loop_end li $t0, 10 mul $s0, $s0, $t0 addu $s0, $s0, $s1 j Lread_int_loop Lread_int_loop_end: move $v0, $s0 Lread_int_end: jr $s7 ### read_int('2') < "097" .data eol: .asciiz "\n" .text main: li $a0, 0x32 jal read_int move $a0, $v0 li $v0, 1 syscall la $a0, eol li $v0, 4 syscall li $a0, 0 li $v0, 10 syscall