MIPS汇编问题

时间:2017-04-02 04:12:59

标签: mips

我正在完成我的任务,我有几个问题。

  1. 我是否必须始终将参数/返回值寄存器推送到堆栈?如果答案是肯定的,我该怎么办?在来电或被叫程序中?

  2. 我正在尝试优化我的指示。我想知道我是否可以改变

    slt $t0, $a0, a1    #check if a<b
    beq $t0,$zero, ELSE     #if $a>b, $t0 = 0, go to else
    addi $v0, $zero,1       #a<b, return 1
    j    exit               #end if, jump to exit
    ELSE: addi $v1, $zero, 0 #a>b, return 0
    exit: jr  $ra           #return to address
    

    slt  $v0, $a0, a1    #if a<b, $v0 =1 and if a>b, $v0 = 0
    jr   $ra             #return to address
    

1 个答案:

答案 0 :(得分:1)

MIPS将寄存器划分为保留和非保留类别。保留的寄存器包括$s0 – $s7(因此保存了它们的名称)。非保留寄存器包括$t0 – $t9(因此它们的名称是临时的)。函数必须保存和恢复它希望使用的任何保留寄存器,但它可以自由地更改非保留寄存器。

被叫方必须保存并恢复任何保留的内容 注册它希望使用。被调用者可以改变任何未保存的 寄存器。因此,如果调用者在非保留寄存器中保存活动数据, 调用者需要在进行函数调用之前保存该非保留寄存器,然后需要将其恢复。

由于这些原因,保留了下来 寄存器也称为 callee-save ,并调用非保留寄存器 呼叫者保存