mips:将字符串存储在堆中的函数

mips: funtion to store string in heap

我一直在尝试创建一个函数来将字符串(作为参数传递给函数)存储到堆中,并使其 return 成为保存它的内存地址。为此,我制作了一个循环,遍历字符串的每个字符并将其放入分配的字节中。但是,我收到消息“无效的程序计数器值:0x00000000”

这就是我目前的情况,有什么地方可能有问题吗?


main:
    #Parameters for function
    #a0 (string)
    #a1 (string size)
    
    la $a0, string
    lw $a1, size
    
    jal saveString

    #Registers planification:
    #s0: string copy
    #s1: where space is saved
    #s2:  index pointer for the loop
saveString:
    sw $fp, ($sp)
    sw $ra, -4($sp)
    sw $s0, -8($sp)
    sw $s1, -12($sp)
    sw $s2, -16($sp)
    move $fp, $sp
    addi $sp $sp -20
    
    move $s0, $a0
    
    #allocate memory
    li $v0, 9
    move $a0, $a1
    syscall
    
    bltz $v0, saveString_noMemory
    
    #save pointer with $v0
    move $s1, $v0
    
    #initialize array pointer
    add $s2, $zero, 0

    jal saveString_Loop
    
saveString_Loop:
    beq $s2, $a1, saveString_End

    lbu $t0, ($s0)      #take value of string
    sb $t0, ($s1)       #inserto that value into one bit of allocated memory
    
    addi $s0, $s0, 1    #point to next char of the string
    addi $s1, $s1, 1    #point to next byte of allocated memory
    
    addi $s2, $s2, 1    #i++
    
    move $v0, $t0
    
    b saveString_Loop
    
saveString_NoMemory:
    #todo: error message
    jr $ra
    
saveString_End: 
    lw $fp, ($sp)
    lw $ra, -4($sp)
    lw $s0, -8($sp)
    lw $s1, -12($sp)
    lw $s2, -16($sp)
    move $sp, $fp
    
    jr $ra
    

这似乎是调用约定错误。您正在将 $ra 保存到堆栈中,但在完成函数后不会恢复它。请记住 jal 将覆盖 $ra。所以当你这样做时

jal saveString

您将无法再使用 jr $ra return 到原始函数,直到您通过从堆栈加载来恢复 $ra。