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 convert サブルーチン:

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

デポジットに入ると、AsciiConvert を jal してから、deposit_Checking サブルーチンに入りますが、deposit_Checking の戻りアドレスは、deposit_Checking サブルーチンを呼び出した行ではなく、jal AsciiConvert の行に戻り、無限につながります。 Ascii convertサブルーチンとdeposit_Checkingサブルーチンの間のループ...誰か助けてくれませんか?

4

1 に答える 1