Removing Spaces from String in MIPS

2020-02-15 05:32发布

问题:

I am currently trying to write a code that takes in a string and outputs that same string with no spaces. Everything in my code currently works, but the outputs don't delete previous values of the string. For example, if the input is "jack and jill ran up the hill", the output is "jackandjillranupthehill hill". It seems that my string is still holding on to old values. Does anyone have any idea why this is doing this and how to fix it?

.data 
string1: .space 100
string2: .space 100
ask: .asciiz "Enter string: "
newstring: .asciiz "New string:\n"

.text

main:
la $a0,ask #ask for string1
li $v0,4
syscall

#load String1
la $a0,string1
li $a1, 100
li $v0,8 #get string
syscall


load:
la $s0,string1  #Load address of string1 into s0
lb $s1, ($s0)   #set first char from string1 to $t1
la $s2 ' '  #set s2 to a space
li $s3, 0   #space count


compare:
#is it a space?
beq $s1, $zero, print   #if s1 is done, move to end
beq $s1, $s2, space #if s1 is a space move on
bne $s1, $s2, save  #if s1 is a character save that in the stack

save:
#save the new string
sub $s4, $s0, $s3, 
sb $s1, ($s4)
j step

space: 
addi $s3, $s3, 1 #add 1 if space

step:
addi $s0, $s0, 1 #increment first string array
lb $s1, ($s0) #load incremented value
j compare



print:
#tell strings
la $a0, newstring
li $v0,4
syscall

#print new string
la $a0, string1
li $v0, 4
syscall

end:
#end program
li $v0, 10
syscall #end

回答1:

Strings are NULL terminated, you should move that terminating NULL to the new end of your string as well.

On a side note, you could do the whole thing in place (for ease in C code:)

#include <stdio.h>

int main() {
  char string1[100];
  fgets (string1, 100, stdin);
  char *inptr = string1; //could be a register
  char *outptr = string1; //could be a register
  do
  {
    if (*inptr != ' ')
      *outptr++ = *inptr;
  } while (*inptr++ != 0); //test if the char was NULL after moving it
  fputs (string1, stdout);
}


回答2:

This is another way to remove spaces from the sting and print it back. simply loop the string and ignore spaces.

    .text
main:
    li $v0, 4       
    la $a0, prompt
    syscall

    li $v0, 8       
    la $a0, input
    li $a1, 100
    syscall

    move $s0, $a0

loop:
    lb $a0, 0($s0)
    addi $s0, $s0, 1
    beq $a0, 32, loop
    beq $a0, $zero, done    

    li $v0, 11
    syscall

    j loop

done:
    jr $ra

    .data
prompt: .asciiz "Enter a string: "
input: .space 100