2017-04-02 5 views
3

과제를 다하고 있으며 몇 가지 질문이 있습니다.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 
    
+0

1) 호출 규칙에 따라 다릅니다. 2) 최적화에서'$ v1'은 어떻게 되었습니까? – Michael

+0

$ v1을 사용하지 않았습니다. – Lalita

답변

1

MIPS 보존 nonpreserved 범주로 나누어 레지스터로 변경할 수 있을까. 보존 된 레지스터는 $s0 – $s7을 포함합니다 (따라서 이름이 저장됩니다). 예약되지 않은 레지스터에는 $t0 – $t9 (따라서 이름이 임시 임)이 포함됩니다. 함수는 사용할 보존 된 레지스터를 저장하고 복원해야하지만 예약되지 않은 레지스터는 자유롭게 변경할 수 있습니다.

피신자는 사용하고자하는 보존 된 레지스터를 저장하고 복원해야합니다. 피 호출자는 예약되지 않은 레지스터 중 하나를 변경할 수 있습니다. 따라서 호출자가 예약되지 않은 레지스터에 활성 데이터를 보유하고있는 경우 호출자는 함수 호출을하기 전에 예약되지 않은 레지스터를 저장해야하고 이후에이를 복원해야합니다. 이러한 이유로

는 레지스터는 을 호출자-저장라고 보존 및 nonpreserved 레지스터는 가 을 호출자 저장이라고합니다.