我无法弄清楚我的汇编代码中出错了什么。我正在尝试编写一个程序来比较两个以null结尾输入的空终止字符串,以及在“main:”部分中某个时间的$ a1,然后调用
jal hamming
启动程序。
基本上,对于本节,我希望将两个字符串与char进行比较,直到一个字符串命中空终止字符。然后程序停止并返回多少个字符,直到终止为止。
我认为这与我正在使用的跳跃有关,但我不太确定。程序有点长,所以我选择了我认为是问题的主要部分(因此忽略了像$ a3这样已经初始化和定义的变量):
diffchar:
li $t4, 0
li $t5, 1
beq $a0, $a1, samechars
move $v0, $t5
j diffcharend
samechars:
move $v0, $t4
diffcharend:
jr $ra
hamming:
absvaluedone:
li $a2, 0
#li $v0, 0
move $t0, $a0
move $t1, $a1
hammingloopbegin:
lb $t2, 0($t0)
lb $t3, 0($t1)
beq $t2, $0, hammingdone
beq $t3, $0, hammingdone
la $a0, 0($t0)
la $a1, 0($t1)
jal diffchar **#this is the line that causes me problems, if I take this out it is fine**
beq $v0, $0, next
addiu $a2, $a2, 1
next:
addiu $t0, $t0, 1
addiu $t1, $t1, 1
j hammingloopbegin
hammingdone:
add $v0, $a2, $a3
jr $ra
当我运行我的程序时,我的输出看起来像一个无限循环,一直说:
Exception occurred at PC=0x00400144
Bad address in data/stack read: 0x10021226
Exception 7 [Bad address in data/stack read] occurred and ignored
Exception occurred at PC=0x00400140
Bad address in data/stack read: 0x1002121b
Exception 7 [Bad address in data/stack read] occurred and ignored
我认为diffchar或我用来跳转到diffchar的过程有问题。这是我第一次编写汇编代码,所以我认为这是一些非常基本的东西我错过了让这个搞砸了。任何指针都会很棒。
感谢您的帮助
答案 0 :(得分:2)
您不会在jal diffchar
之前保存返回地址。它返回,$ra
仍保留新值。当您jr $ra
再次hammingdone
时,您会在diffchar
电话后跳回到右侧。在调用$ra
之前,您需要在某处存储diffchar
,并在调用返回后将其恢复。
这是一个good explanation of nested procedures in MIPS,它描述了您遇到的问题以及使用运行时堆栈的解决方案:
执行
jal B
指令时,寄存器中的返回地址 程序A的$ra
将被返回地址覆盖 程序B.程序B将正确返回A,但何时 程序A执行jr
指令,它将再次返回到 B的返回地址,这是jal B
之后的下一条指令 程序A.这使程序A处于无限循环中。...
系统堆栈通常用于保存返回地址。他们能 调用过程并弹出时,将其推入堆栈 执行返回指令。
寄存器
$ra
中的返回地址可以推送到系统堆栈中 使用以下MAL代码:sw $ra, ($sp) add $sp, -4
以下代码从堆栈顶部弹出一个返回地址 将其返回寄存器
$ra
:add $sp, 4 lw $ra, ($sp)