MIPS函数调用和堆栈指针。程序不返回主函数

时间:2015-03-17 15:56:20

标签: assembly mips code-translation

我的任务是将以下c代码转换为MIPS程序集。

int compare(int a, int b) {
if ( add(b, a) >= 100) 
    return a;
else
    return b; }

int add(int x, int y){
    return (x+y); } 

这是我设法编写的但不知何故它没有返回值。在我提供的用于测试程序的参数的情况下,它应该返回5。我猜测问题与堆栈指针和返回地址有关。 MARS模拟器告诉我:" - 程序运行完毕(从底部掉下来) - "

在MARS上编译的MIPS代码:

.data
.text
.globl main

main:

    addiu $a0, $zero, 10
    addiu $a1, $zero, 5

    jal compare

    addu $s1, $v0, $zero

    addu $a0, $zero, $s1 # print value
    li $v0, 1
    syscall

    li $v0, 10
    syscall

compare:
    addiu $sp, $sp, -12 #adjusting stac for 3 items

    sw $ra, 0($sp)
    sw $a0, 4($sp)      #saving return address and arguments
    sw $a1, 8($sp)

    lw $a0, 8($sp)      #swaping arguments
    lw $a1, 4($sp)

    jal addition        #calling addition procedure

    blt $v0, 100, return_b      #if add(b,a) < 100 return b

    lw $v0, 4($sp)          #else

    j return_value          

return_b:
    lw $v0, 8($sp)

return_value:   
    lw $ra, 0($sp)
    lw $a0, 4($sp)      #restoring arguemtns and return address
    lw $a1, 8($sp)

    addiu $sp, $sp, 12

    jr $ra

addition:
    addu $v0, $a0, $a1
    jr $ra

0 个答案:

没有答案