Click to See Complete Forum and Search --> : MIPS program need some help please :)


flamik
April 18th, 2005, 05:10 PM
Hi Guys,
So I started writing this program where i want the user to input a string
of numbers and letters and then i want to print out just the letters from
the sting ignoring all the letters and other characters such as , ; : * &...
I got it to take the string no problem and then i did the bgt and blt 's so
that it skips all the ascii characters i don't want it to use but when it prints out
the resulting string I'm still getting the original string ;( I have no idea
where I made the mistake Please give me some ideas thx


.data
ask: .asciiz "Type a character string (<31 chars long): "
count: .asciiz "number: "
maxlen: .word 31
buffer: .space 31 # allocates 31 bytes of memory in the data segment
str: .space 31


.text
.globl main

main:
li $v0, 4
la $a0, ask # Print "Type a character string: "
syscall

la $a0, buffer # $a0 holds the address of the read buffer
lw $a1, maxlen # Max number of chars (including the end of string char)
li $v0, 8 # Load the service number
syscall # Call the operating system

# Copy the buffer into str and replace lower case letters with upper case letters

li $t2, 58 # the ASCII code of ":"
li $t3, 47 # the ASCII code of "/"
li $t0, 0 # $t0 is the index
li $t4, 0


loop:
lb $t1, buffer($t0) # fetch a char from the buffer
blt $t1, $t2, skip # the char is before ":", skip it Branch on Less Than
bgt $t1, $t3, skip # the char is after "/", skip it Branch on Greater Than


skip:
addi $t4, $t4, 1
sb $t1, str($t0) # and store it into str
addi $t0, $t0, 1 # increment index
bne $t1, $0, loop # if $t1 <> "end of string" then goto loop



li $v0, 4
la $a0, str # Print str
syscall

sub $t4, $t4, 2
li $v0, 4
la $a0, count
syscall
move $a0, $t4
li $v0, 1
syscall

NigelQ
April 19th, 2005, 11:10 AM
It looks like your branch to skip is not skipping anything, maybe skip needs to be moved like below?


loop:
lb $t1, buffer($t0) # fetch a char from the buffer
blt $t1, $t2, skip # the char is before ":", skip it Branch on Less Than
bgt $t1, $t3, skip # the char is after "/", skip it Branch on Greater Than

#from here
addi $t4, $t4, 1
sb $t1, str($t0) # and store it into str
#to here...
skip:
addi $t0, $t0, 1 # increment index
bne $t1, $0, loop # if $t1 <> "end of string" then goto loop



You should also ensure that the result string is correctly null terminated if that's what you need. The code here assumes that there is a null terminator in the source string (and you may now be skipping the null).

The easiest way to acheive this might be to fill str will nulls before the loop.

Hope this helps,

- Nigel

flamik
April 20th, 2005, 08:12 AM
HI,
THank you for replying :)
I tried doing as you said but now I am getting no answer at all for the
resulting string ;(
I don't know what other approach i can come up with :)

NigelQ
April 20th, 2005, 11:43 AM
I would re-check the logic of what you are testing for in your branch jumps.

Jump to skip on less than ':' and also greater than '/'

So, with '/' being less than ':' it will always branch.

You said you want to just collect letters from the string. You will need to modify the code to branch to skip if less than 'A' and branch if greater than 'z'

You would also need to branch if greater than 'Z' AND less than 'a'

Hope this helps,

- Nigel

flamik
April 20th, 2005, 02:48 PM
AHHHHH :O) I FOUND MY MISTAKE :O) so silly so silly :O) i just added another sb in the skip label for my index and moved the label as you suggested and WORKS
thanks a bunch ;O)