51 lines
1 KiB
Text
51 lines
1 KiB
Text
# $a0 char val
|
|
# $a1 address pointer
|
|
# $a2 PERIOD_HIT_FLAG
|
|
# $a3 HAS_DIGITS_FLAG
|
|
|
|
.data
|
|
### CHANGE THIS STRING TO TEST DIFFERENT ONES... ###
|
|
string: .asciiz "-.1236"
|
|
s_false: .asciiz "False"
|
|
s_true: .asciiz "True"
|
|
.text
|
|
main:
|
|
set_up: #test for 0th char == 45 or 46 or 48...57
|
|
la $a1,string
|
|
lb $a0,($a1)
|
|
beq $a0,45,loop # == '-'
|
|
beq $a0,46,loop # == '.'
|
|
blt $a0,48,exit_false # isn't below the ascii range for chars '0'...'9'
|
|
bgt $a0,57,exit_false # isn't above the ascii range for chars '0'...'9'
|
|
loop:
|
|
addi $a1,$a1,1
|
|
lb $a0,($a1)
|
|
beqz $a0,exit_true # test for \0 null char
|
|
beq $a0,46,period_test #test for a duplicate period
|
|
blt $a0,48,exit_false #test for
|
|
bgt $a0,57,exit_false
|
|
la $a3,1 #set the HAS_DIGITS flag. This line is only reached because the
|
|
# tests for period and - both jump back to start.
|
|
j loop
|
|
|
|
exit_true:
|
|
beqz $a3,exit_false
|
|
la $a0,s_true
|
|
la $v0,4
|
|
syscall
|
|
|
|
li $v0,10
|
|
syscall
|
|
|
|
exit_false:
|
|
la $a0,s_false
|
|
la $v0,4
|
|
syscall
|
|
|
|
li $v0,10
|
|
syscall
|
|
|
|
period_test:
|
|
beq $a2,1,exit_false
|
|
li $a2,1
|
|
j loop
|