设要求为编写一个MARS的程序,使得程序可以完成输入一个字符串,并将该字符串输出,并附有文字提示,输出的格式如下:
Input a string: abandon
String = [abandon] 忽略输入的过程,到最后输出String = [abandon]的部分
若正常的将字符串输出,例如下面的代码所示
# 输出 String = [
li $v0, 4
la $a0, output2
syscall
# 输出输入的字符串
li $v0, 4
la $a0, input
syscall
# 输出 ]
li $v0, 4
la $a0, output3
syscall
b Exit 输出的结果如图1所示,MARS会在输出字符串的同时输出一个换行符。输出的结果为
Input a string: abandon
String = [abandon
] 明显与我们想要的结果多了一个换行符,接下来说解决的方法。

图1 修改前的结果
为了解决换行符的问题,将代码做如下修改
# 输出 String = [
li $v0, 4
la $a0, output2
syscall
# ###########################
# 对字符串最后的地址填充0
# 以达到替换换行符的目的
# 需要知道字符串的长度
la $t0, input
add $t4, $t0, $t3
sb $zero, ($t4)
# ###########################
# 输出输入的字符串
li $v0, 4
la $a0, input
syscall
# 输出 ]
li $v0, 4
la $a0, output3
syscall 使用sb指令将换行符的位置替换为$zero,替换后运行的结果如图2所示,字符串长度的获取使用循环语句完成,详细代码附在文末。

详细代码:
# 输入一个字符串
# 输出左括号[
# 输出字符串
# 输出]
.data
input: .space 31
inputSize: .word 30
output1: .asciiz "Input a string: "
output2: .asciiz "String = ["
output3: .asciiz "]"
.text
main:
# 输出 Input a string:
li $v0, 4
la $a0, output1
syscall
# 读取输入的字符串
li $v0, 8
la $a0, input
lw $a1, inputSize
syscall
# 字符串长度检测存储到$t3
la $t0 input
loops:
lb $t1 0($t0)
beq $t1 $zero end
addi $t0 $t0 1
j loops
end:
la $t1 input
sub $t3 $t0 $t1 # $t3 now contains the length of the string
move $t4, $t3
sb $zero,0($t3)
sub $t3 $t3 1 # 由于包含换行符 -1
sub $t4 $t4 2
# 输出 String = [
li $v0, 4
la $a0, output2
syscall
# ###########################
# 对字符串最后的地址填充0
# 以达到替换换行符的目的
# 需要知道字符串的长度
la $t0, input
add $t4, $t0, $t3
sb $zero, ($t4)
# ###########################
# 输出输入的字符串
li $v0, 4
la $a0, input
syscall
# 输出 ]
li $v0, 4
la $a0, output3
syscall
b Exit
Exit: # 退出程序
li $v0, 10
syscall
转载请注明出处