Кажется, вам нужно сначала скопировать входную строку в строку output
, а когда вы передаете массив output
в функцию reverse
, вам нужно переместить указатель на длину входной строки (передавая output + strlen(input)
) поэтому обратная строка будет написана прямо рядом с ней.
Также я думаю, что вы должны использовать буфер для ввода. Также позаботьтесь о символе '\n'
в конце входной строки, поскольку он будет там.
Имея это в виду, я изменил ваш код на
.data
msg1: .asciiz "Enter the length of your input: "
msg2: .asciiz "Enter your input: "
msg3: .asciiz "Output of the program is: "
input: .space 128
output: .space 256 # will store the output palindrome
.text
la $a0,msg1
li $v0,4
syscall
li $v0,5
syscall
move $s1,$v0 # $s1 has the length of the string
la $a0,msg2
li $v0,4
syscall
move $a1, $1
la $a0, input
li $v0,8
syscall
move $s0,$a0 # $s0 has the starting address of the string
#
# YOUR CODE GOES HERE(You can use additional labels at the end)
#
move $a3,$s0 # a3 = (char *)input
move $a1,$s1 # a1 = strlen(input)
# replacing the read in new line char with 0
la $t4, input
add $t4, $t4, $a1
sb $zero, ($t4)
# copy the string to the resulting string
move $t0, $s1 # i = strlen(input)
move $t1, $s0
la $t3, output
copy_loop:
beq $t0, $zero, copy_end # i != 0
lb $t2, ($t1)
sb $t2, ($t3) # *output = *input
addi $t1, $t1, 1 # advancing the input ptr
addi $t3, $t3, 1 # advancing the output ptr
subi $t0, $t0, 1 # i--
b copy_loop
copy_end:
add $a3,$a3,$a1 # a3 = &input[strlen(input)]
subi $a3,$a3,1 # subtracting one since the last input char is at input[strlen(input)-1]
la $a2, output
add $a2, $a2, $a1 # passing the address of output advanced by the input length
jal reverse
la $a0,msg3
li $v0,4
syscall
la $a0,output($zero)
li $v0,4
syscall
li $v0,10
syscall
reverse:
# $a0 - address of string to reverse
# a1 - length of the string
# a2 - address of string where to store the reverse
addi $sp, $sp, -4
sw $ra, 0($sp)
bltz $a1, reverse_end
lb $t0, 0($a3)
subi $a1, $a1, 1
subi $a3, $a3, 1
sb $t0, 0($a2)
addi $a2, $a2, 1
jal reverse
reverse_end:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
, который, кажется, поработайте над своими примерами в симуляторе MARS 4.5 MIPS.
Весьма вероятно, что этот код может быть выполнен более оптимальным способом, но все же, похоже, он выполняет свою работу.
РЕДАКТИРОВАТЬ Идея: сохранить входные данные в выходной строке таким образом, чтобы копирование не требовалось, поэтому код можно уменьшить до этой (только соответствующая часть)
move $a1, $1
la $a0, output # !! using the output buffer for the input
li $v0,8
syscall
move $s0,$a0 # $s0 has the starting address of the string
#
# YOUR CODE GOES HERE(You can use additional labels at the end)
#
move $a3,$s0 # a3 = (char *)input
move $a1,$s1 # a1 = strlen(input)
# the whole copy thing deleted and don't need to be bothered by the new
# lines, it will be overwritten with the reversed string anyway
add $a3,$a3,$a1 # a3 = &input[strlen(input)]
subi $a3,$a3,1 # subtracting one since the last input char is at input[strlen(input)-1]
la $a2, output
add $a2, $a2, $a1 # passing the address of output advanced by the input length
jal reverse