我在MIPS中编写了一个函数,
void decodeNull(char[] text, char[] output, int outputLength, int[] pattern)
一段文本$ a0包含由整数数组确定的密码。如果索引为1,则读入第一个单词的第一位,将其转换为大写,并将其添加到$ a1中输出的起始地址。如果索引是2,则读入单词的第二个字母并将其添加到输出...等。如果索引为0,则跳过整个单词,然后转到下一个索引。如果索引为-1,则表示已到达字符串的末尾。
例如:
模式($ a3):[4,2,0,2,-1]
输入文字($ a0):Hel l o y 名称 s
输出($ a1):LYS
我已多次完成我的算法以完成,并且所有值似乎都是正确的。但是当我调用jr $ ra时,我得到错误:无效的PC值0x00000000。我不确定这个错误意味着什么,而且我不知道在我的代码中查找的位置。
我认为这可能与我如何存储输出有关。 当我将需要的字符传递给我的辅助函数toUpper时,我将返回值($ v0)存储到$ a1中,这应该是输出的起始地址。然后我移动到输出地址中的下一位,然后移到下一个字。
addToOutput:
move $a0, $t7 #t7 contains the bit to be stored in the output
jal toUpper
sb $v0, 0($a1) #add return value to a1
addi $a1, $a1, 1
j goToNextWord
也许$ a1指向输出地址的末尾,如果是这样,我怎么能把它移回到开头呢?我尝试将输出的原始地址保存到$ s1(移动$ s1,$ a1),然后在jr $ ra之前调用lw $ a1,0($ s0),但没有成功。
我认为这也可能是我的$ sp的一个问题。我开始我的功能 decodeNull: #(char [] text,char [] output,int outputLen,int [] pattern) #text = $ a0,output = $ a1,outputLen = $ a2,pattern = $ a3 addi $ sp,$ sp,-20 sw $ ra,0($ sp) sw $ a0,-4($ sp)#text(string) sw $ a1,-8($ sp)#output(string) sw $ a2,-12($ sp)#outputLen(int) sw $ a3,-16($ sp)#pattern(int [])
move $s1, $a1 #ADDRESS OF OUTPUT IN S1
move $s3, $a3 #ORIGINAL ADDRESS OF PATTERN IN S3
move $s0, $a0 #ORIGINAL ADDRESS OF TEXT IN S0
并以
结束end:
addi $sp, $sp, 20
lw $ra, 0($sp) #text (string)
lw $a0, 4($sp) #output (string)
lw $a1, 8($sp) #outputLen (int)
lw $a2, 12($sp) #pattern (int[])
lw $a3, 16($sp)
jr $ra
我认为这是正确的,但我不确定。我想如果我理解这个错误意味着什么我可以解决问题,但我不知道在哪里查看我的代码。
请帮忙!