2016-11-09 68 views
1

我正在努力完成编写一个mips回文函数,该函数“向后读取相同的前向”,并且我的函数没有按需要工作。这是伤害我的大脑和任何帮助,不胜感激。谢谢!为什么mips回文功能不能按照规范工作?

回文的递归定义如下: 设字符串S表示为S = S1 S2 ... SN,其中N是字符串的长度。

S is a palindrome 
    if N = 0 or N = 1 or 
    if N 2 and S1 = SN and the substring (S2 .. SN-1) is a palindrome. 

功能帕林($ A0,$ A1) 前提条件:

$ A0保持第一字节的地址的字符串(或子串)中,同时$ A1保持的字符串的长度被测试(或子串)

后置条件:

1(真)被返回到寄存器$ V0如果给定的字符串(或子串)是回文;否则,在$ v0中返回0(false)。

.data 
    prompt1: .asciiz "Enter length of string to be read: " 
    prompt2: .asciiz "Enter the string " 
    ItIs:  .asciiz "\nThe string IS a palindrome!" 
    IsNot: .asciiz "\nThe string is NOT a palindrome!" 
    string: .asciiz "" 

    .text 
    .globl main 
main:  

    la $a0, prompt1 
    li $v0, 4 
    syscall 

    li $v0, 5 
    syscall 
    move $a1, $v0 

    la $a0, prompt2 
    li $v0, 4 
    syscall 

    addi $a1, $a1, 1 
    la $a0, string 
    li $v0, 8 
    syscall 

    addi $a1, $a1, -1 

    jal Palin 

    bne $v0, $zero, label1 
    la $a0, IsNot 
    j label2 
label1: 
    la $a0, ItIs 
label2: 
    li $v0, 4 
    syscall 

    li $v0 10 
    syscall   
    nop 


Palin: 

# HERE IS THE FUNCTION 

li $v0, 10 
    syscall 
    addu $ra, $zero, $s7  #restore $ra since the function calles 
           #another function 
    jr  $ra 
    add $zero, $zero, $zero 
    add $zero, $zero, $zero 

EndPalin: 
+0

什么意思是“不工作”? – smac89

+0

对不起,我应该澄清。功能是问题。当我执行代码时,会显示第一个和第二个提示符,但输入一个字符串后,程序会退出而不打印,不管“是或不是”。 @ smac89 – MercedezB

回答

1

问题是这样的:

Palin: 

# HERE IS THE FUNCTION 

li $v0, 10 # These 
    syscall # lines 

值10,退出程序的陷阱,因为你是加载到寄存器$v0,然后做了一个syscall,程序退出。删除那些违规的线路,你应该在你快活的方式。

HTH

+0

嗯,删除它现在产生了读取错误的违规行之后“中的文字错误地址改为:00000000, 异常发生在PC = 0x00000004,在文本 错误地址写着:0x00000004, 异常发生在PC = 0x00000008” @ smac89 – MercedezB

+0

@MercedezB如果你从你的模拟器中得到了这个,那么我无法帮到你。我所能说的只是确保你正确地退出,以便mips不会尝试读取无效的指令,从而导致其行为不正常 – smac89

相关问题