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