Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.5k views
in Technique[技术] by (71.8m points)

assembly - Removing Spaces from String in MIPS

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:
"

.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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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);
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...