Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS中的回文生成_Assembly_Mips_Mips32 - Fatal编程技术网

Assembly MIPS中的回文生成

Assembly MIPS中的回文生成,assembly,mips,mips32,Assembly,Mips,Mips32,我需要帮助来编写一个生成回文的程序。我设法使字符串反转,但我无法将原始字符串和反转字符串组合在一起。当我写abc时,我需要得到abccba,或者当我写hello时,我需要得到Hellooleh。现在我只拿到cba或olleh。有人能帮我解决这个问题吗 .data msg1: .asciiz "Enter the length of your input: " msg2: .asciiz "Enter your input: " msg3: .asciiz "Output of the progr

我需要帮助来编写一个生成回文的程序。我设法使字符串反转,但我无法将原始字符串和反转字符串组合在一起。当我写abc时,我需要得到abccba,或者当我写hello时,我需要得到Hellooleh。现在我只拿到cba或olleh。有人能帮我解决这个问题吗

.data
msg1: .asciiz "Enter the length of your input: "
msg2: .asciiz "Enter your input: "
msg3: .asciiz "Output of the program is: "

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


li $a1,1024
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
move $a1,$s1




add $a3,$a3,$a1
la $a2, output($zero)
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

编辑:这也是回文生成的C++实现。p> 回文生成递归算法的C++实现

#include <iostream>
#include <string>

using namespace std;

string palindrom(string input, int rem_length)
{

  if(rem_length!=0)
  {
    input=input.substr(0,1)+palindrom(input.substr(1,input.length()-1), \\
                                      rem_length-1)+input.substr(0,1);
  }
  return input;
}

int main()
{
  string input;
  cin >> input;

  input = palindrom(input, input.length());

  cout << input<< endl;

  system("pause");

  return 0;
}
#包括
#包括
使用名称空间std;
字符串回文(字符串输入,整数长度)
{
如果(rem_长度!=0)
{
input=input.substr(0,1)+回文(input.substr(1,input.length()-1)\\
rem_长度-1)+输入substr(0,1);
}
返回输入;
}
int main()
{
字符串输入;
cin>>输入;
输入=回文(输入,输入.length());

cout您似乎只需要首先将输入字符串复制到
输出
字符串,当您将
输出
数组传递到
反向
函数时,您需要将指针向前移动输入字符串长度(传递
输出+strlen(输入)
),以便将反向字符串写入它旁边

另外,我认为您应该为输入使用缓冲区。还要注意输入字符串末尾的
'\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模拟器中的示例

这段代码很有可能以一种更优化的方式完成,但它似乎仍然完成了任务

EDITIdea:将输入保存到输出字符串中,这样就不需要副本,因此代码可以简化为此(仅相关部分)


@cvsrt很高兴能帮上忙。请看我所做的编辑。将添加的代码变小。很可能这段代码可以用一种更优化的方式来完成OMFG是的。特别是如果您不必使其递归!!就地数组反转是递归执行的最不自然的事情之一。因为
read
提供了长度,您可以得到一个指向用户输入末尾的指针,带有两条指令。(并且您已经在reg=end地址中有了开始地址,用于向后循环)。因此,从字符串末尾向后循环一个读指针,向前循环一个写指针,进行复制和反转。如果一次只循环一个字符,则需要一个简单的lbu/sb循环。
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