解决MARS汇编的输出字符串换行的问题
xswznb
2022年10月03日 17:30

问题:

设要求为编写一个MARS的程序,使得程序可以完成输入一个字符串,并将该字符串输出,并附有文字提示,输出的格式如下:

代码块
JavaScript
自动换行
复制代码
Input a string: abandon

String = [abandon]
复制成功

忽略输入的过程,到最后输出String = [abandon]的部分

若正常的将字符串输出,例如下面的代码所示

代码块
Shell
自动换行
复制代码
	# 输出 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会在输出字符串的同时输出一个换行符。输出的结果为

代码块
clike
自动换行
复制代码
Input a string: abandon

String = [abandon
]
复制成功

明显与我们想要的结果多了一个换行符,接下来说解决的方法。

图1 修改前的结果

解决方法:

为了解决换行符的问题,将代码做如下修改

代码块
Shell
自动换行
复制代码
	# 输出 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所示,字符串长度的获取使用循环语句完成,详细代码附在文末。

详细代码:

代码块
clike
自动换行
复制代码
# 输入一个字符串
# 输出左括号[
# 输出字符串
# 输出]

.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
复制成功

转载请注明出处