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。
我一直在尝试创建一个函数来将字符串(作为参数传递给函数)存储到堆中,并使其 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。