0

我编写了一个迷你银行程序,它调用子路由存款中的多个函数,这是子程序

deposit:
    addi $sp, $sp, -8 #save space on stack
    addi $s3, $0, 1 #trigger s3
    sw $s3, 0($sp)
    sw $ra, 4($sp)
    .....
    jal AsciiConvert #convert ascii of deposited amount to integer
    beq $v0, $0, Err_ACC #if no value to be deposited was inputed print error message
    beq $t0, $0, deposit_checking #if check exists returns a 0
    beq $t0, 1, deposit_saving #if check exists returns a 1
    jal printarray
    lw $s3, 0($sp)
    lw $ra, 4($sp)      # reload $ra so we can return to caller
    addi $sp, $sp, 8   # restore $sp, freeing the allocated space
    jr $ra   
    
deposit_checking:
    ... arithmetic operations...
    jr $ra   

ascii 转换子程序:

AsciiConvert:
    ...normal arithemtics...
    j ConvertOP
ConvertOP:
    lb $s0, 0($a1)
    beq $s0, $0, endConvert #end at null terminating
    beq $s0,32,endConvert #if found a space
    addi $s0, $s0, -48 #convert to int
    mul $s2, $s1, 10 #multiply sum by 10
    add $s2, $s2, $s0 #sum = sum + previous number
    add $s1, $s2, $0 #s1 holds previous value
    addi $a1, $a1, 1 #increment adress
    add $v0, $s2, $0 #store the number in the return adress
    j ConvertOP
endConvert:
    jr $ra

当我进入存款时,我 jal AsciiConvert 然后进入 deposit_Checking 子程序,但是该 deposit_Checking 的返回地址将我返回到 jal AsciiConvert 的行,而不是我调用 deposit_Checking 子程序的行,导致无限Ascii 转换子程序和 deposit_Checking 子程序之间的循环......有人可以帮我吗?

4

1 回答 1

1

deposit_checking看起来像一个子程序,您在帖子中将其标识为子程序,但是,我们不输入带有beq指令的子程序,您应该使用它jal来调用子程序。

在机器代码中,$ra对于 MIPS,返回地址实际上是子程序的一个参数——它告诉子程序在调用者中恢复执行的位置,返回到的位置。有几种方法可以为$ra寄存器设置一个有意义的返回地址,当然jal这是迄今为止最常用的方法。

beq通过更改程序计数器(pc)将处理​​器的控制权转移到目标标签(当 eq 为真时),但不提供(新)$ra值。

通过不设置$ra新值,它的旧值被保留。由于$ra寄存器最后由 设置jal AsciiConvertjr $ra对于另一个函数返回到那里,更明智的是这不是正确的调用——因为正确设置该参数是调用者的工作。

虽然某些指令集允许在条件上调用,但我们不一定希望所有beqs 都捕获返回地址,因为这样任何使用的函数beq都必须关注自身的保留$ra

我们还要注意,这些行为在调试期间都是可见的。  jr $ra,例如将控制转移到$ra寄存器中的值寻址的任何机器指令。当你第一次进入一个子程序/函数时,应该在$ra寄存器中提供一个适当的返回地址参数,当你到达函数的最后一条指令的末尾时jr $ra,如果$ra寄存器中的值已经从入口改​​变了,那么它就不会回到它被调用的地方——所以我们会在这些变化之间寻找某个地方$ra,而不是把它恢复回来。

于 2020-11-30T21:29:50.127 回答