Assembly 带有jr$ra的mips嵌套过程

Assembly 带有jr$ra的mips嵌套过程,assembly,nested,mips,Assembly,Nested,Mips,我正在尝试调用FUNC并将其值返回给xintersect。我认为使用jr$ra应该返回给调用者,但它跳到了代码的末尾。我不能修改FUNC,因为它是给定的示例测试用例。有什么想法吗?以下是我的MIPS代码: .globl FUNC FUNC: mul $t0, $a0, $a0 addi $v0, $t0, -16 jr $ra # expect 4 in $v1 main: la $a0, FUNC li $a1, 0#a l

我正在尝试调用FUNC并将其值返回给xintersect。我认为使用jr$ra应该返回给调用者,但它跳到了代码的末尾。我不能修改FUNC,因为它是给定的示例测试用例。有什么想法吗?以下是我的MIPS代码:

 .globl FUNC
FUNC:  
    mul   $t0, $a0, $a0
    addi  $v0, $t0, -16
    jr    $ra
# expect 4 in $v1
main:  
    la $a0, FUNC
    li $a1, 0#a
    li $a2, 100#b
    b  xintersect
xintersect:
    subu $s0, $a2, $a1
    sltiu $t3, $s0, 1
    add $s5, $0, $a0
    bne $t3, 1, whileLoop
    #return the value in $v1
    add $v1, $a1, $0
    jr $ra
whileLoop:
    addu $s2, $a1, $a2
    srl $a0, $s2, 1#m in $a0
    jr $s5
    slt $s2, $0, $v0
    beq $0, $s2, ifLoop
    addu $a2, $0, $a0
    b whileLoop
ifLoop:
    addu $a1, $0, $a0
    b whileLoop
下面应该是C代码:

int xintersect(int (*f) (int), int a, int b) {
 /* f(a) ≤ 0 ≤ f(b), a ≤ b */
 while (b-a > 1) {
     int m = (a+b)/2;
     if (f(m) <= 0) a = m; else b = m;
     }
 return a;
}
jr$ra依赖于已放置在$ra中的返回地址,但您正在使用未设置$ra的jr$s5调用FUNC。改用jalr$s5

b Xinterct主要应该是日航Xinterct,因为否则jr$ra在Xinterct将不起作用。还请记住,如果xintersect需要同时调用FUNC,然后才能返回main,则它必须在堆栈上的某个位置节省$ra

在我看来,你在信特教也有一个无限循环。一旦进入whileLoop,就不会有任何东西退出循环。

您的while循环没有退出

你需要日本航空公司,所以我也写了这篇文章 您的$ra未保存在XINTERSECT的堆栈中:

恢复原状

lw $ra,$sp
addi $sp,$sp,4 #restore the pointer too

这个东西我也不能修改main,它是用FUNCWell给出的,主例程被破坏了。因此,如果main没有以正确的方式调用xintersect,您需要询问教授或助教如何返回main。现在,我添加终止条件以停止while循环,并将$ra存储在临时寄存器add$t7、$ra、$0中,然后再使用jalr$s5。当我需要使用jr$ra返回main添加$ra、$t7、$0时,我将其存储回$ra。这至少为我提供了正确的输出。只是想知道在MIPS中这样做是否合法?通常,您会使用堆栈来保存$ra,但是如果您知道您没有调用任何会修改$t7的代码,那么使用$t7就可以了。谢谢!帮我大忙!如果新特派立即返回,执行将再次从main进入新特派。那不可能是对的;使用b xintersect进行tailcall是令人惊讶的,但至少是可能的。@frankenapps-关于如何设置文本格式的猜测很好,但我非常确定and是英语,而不是MIPS助记符。文件顶部的代码没有意义,看起来这是一个在xintersect中这样做的建议,尽管大代码块没有这样的更改。
lw $ra,$sp
addi $sp,$sp,4 #restore the pointer too
globl FUNC
FUNC:  
    mul   $t0, $a0, $a0
    addi  $v0, $t0, -16
    jr    $ra
    #expect 4 in $v1

main:  
    la $a0, FUNC
    li $a1, 0#a
    li $a2, 100#b
    jal xintersect

xintersect:
    subu $s0, $a2, $a1
    sltiu $t3, $s0, 1
    add $s5, $0, $a0
    bne $t3, 1, whileLoop
    #return the value in $v1
    add $v1, $a1, $0
    jr $ra
whileLoop:
    addu $s2, $a1, $a2
    srl $a0, $s2, 1#m in $a0
    jalr $s5
    slt $s2, $0, $v0
    beq $0, $s2, ifLoop
    addu $a2, $0, $a0
    b whileLoop
ifLoop:
    addu $a1, $0, $a0
    b whileLoop