Assembly 简单MIPS组件

Assembly 简单MIPS组件,assembly,mips,Assembly,Mips,我不太明白我在汇编代码中做错了什么。我正试图编写一个程序,比较两个以null结尾的字符串,它们在“main:”部分输入为$a0和$a1,然后调用 jal hamming 启动程序 基本上,在这一节中,我希望两个字符串逐字符进行比较,直到一个字符串命中null终止字符。然后程序停止并返回在终止之前有多少个字符是不同的 我想这与我使用的跳跃有关,但我不太确定。程序有点长,所以我选择了我认为是问题所在的主要部分(因此忽略已经初始化和定义的变量,如$a3): 当我运行我的程序时,我的输出看起来像一个无

我不太明白我在汇编代码中做错了什么。我正试图编写一个程序,比较两个以null结尾的字符串,它们在“main:”部分输入为$a0和$a1,然后调用

jal hamming
启动程序

基本上,在这一节中,我希望两个字符串逐字符进行比较,直到一个字符串命中null终止字符。然后程序停止并返回在终止之前有多少个字符是不同的

我想这与我使用的跳跃有关,但我不太确定。程序有点长,所以我选择了我认为是问题所在的主要部分(因此忽略已经初始化和定义的变量,如$a3):

当我运行我的程序时,我的输出看起来像一个无限循环,不断地说:

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的过程有问题。这是我第一次编写汇编代码,所以我认为我缺少了一些基本的东西,而这正是造成这种混乱的原因。任何指点都很好


感谢您的帮助

您没有在
jal diffchar
之前保存回信地址。它返回,
$ra
仍保留新值。当您再次在
hammingdone
中执行
jr$ra
时,您会在
diffchar
调用后跳回右侧。在调用
diffchar
之前,您需要将
$ra
存储在某个位置,并在调用返回后将其还原

下面是一个示例,它描述了您遇到的问题以及使用运行时堆栈的解决方案:

当执行
jal B
指令时,寄存器中的返回地址 程序A的
$ra
将被程序A的返回地址覆盖 程序B。程序B将正确返回到A,但 过程A执行
jr
指令,它将再次返回到 B的返回地址,这是中
jal B
之后的下一条指令 过程A。这将过程A置于无限循环中

系统堆栈通常用于保存返回地址。他们可以 当调用一个过程并弹出到 执行返回指令

寄存器
$ra
中的返回地址可以推送到系统堆栈上 具有以下错误代码:

    sw      $ra, ($sp)
    add     $sp, -4
下面的代码从堆栈顶部弹出一个返回地址,然后 在寄存器中返回它
$ra

    add     $sp, 4
    lw      $ra, ($sp)
    add     $sp, 4
    lw      $ra, ($sp)