2013-11-21 3 views
15

지금까지 레지스터 $ t0- $ t9와 같은 방식으로 레지스터 $ s0- $ s9를 사용했습니다. 나는 여기에 수많은 포럼 글과 단락을 읽었다. 차이점을 설명하는 구글에서 코딩 예제는 없다. 나는 프로 시저를 사용하는 것과 관련된 차이를보아야한다고 들었지만, 저장된 레지스터와 임시 레지스터의 차이점을 찾기 위해 프로 시저를 포함하는 수많은 시나리오를 만들었지 만 실패했습니다.MIPS 어셈블리 언어 - 임시 레지스터 대 저장된 레지스터

$ t0-9 레지스터가 $ s0-9 레지스터와 똑같이 작동하지 않아서 결과적으로 다른 값을 생성하는 비교적 단순한 예제를 보면 죽을 것입니까?

답변

33

임시 변수와 저장된 변수가 작동하는 방식에는 차이가 없습니다. 차이점은 그것이 어떻게 사용되는지, 오히려 어떻게 사용해야하는지에 있습니다.

MIPS의 호출 규칙이 다양한 레지스터가 사용되는 방법을 지정 - $v 레지스터는 함수가 반환위한의 $a 레지스터는 함수 인수위한의 $t 변수는 호출자가 레지스터를 저장 일시적인있는 $s 레지스터 동안 수신자는 입니다.

피 호출자와 호출자의 차이점은 다음과 같습니다. 함수를 호출 할 때 $s 레지스터가 반환 후에 동일하다는 것을 보장하지만 규칙은 $t 레지스터에 대해이를 보장하지 않습니다. 물론 이것은 $s 레지스터를 루틴에 사용하려면 해당 값을 저장하고 복원해야한다는 것을 의미합니다. 예를 들어, 함수 A가 레지스터 과 $s0을 사용하고 함수 B를 호출하면 함수 B가 반환 된 후에 함수 A가이를 사용하려면 레지스터 $t0을 저장해야합니다. 기능 B는 사용을 시작하기 전에 $s0을 저장해야합니다.

예 :

main: 

    li $s0 7 
    li $t0 7 

    jal myFunction 

    #$s0 guaranteed to equal 7 
    #$t0 value not guaranteed 

This link는 몇 가지 괜찮은 더 깊이있는 정보를 것 같습니다.

물론 이것은 모두 규칙 일 뿐이므로 사용자와 다른 프로그램이 $s 레지스터를 저장하고 복원하여 규칙을 준수하고 함수 호출로 덮어 쓰지 않는 경우에만 작동합니다.

+1

$ t가 $ s와 다르게 동작하는 "비교적 간단한 예제"에 대한 포스터의 호소에 회신하려면 myFunction :'addi $ t0, $ 0, 255''jr $ ra'의 정의를 추가하면됩니다. – RobertB

+0

@RobertB 나는 그것이 지나치게 혼란 스러울 것이라고 생각할 것이다. 사용자는'myFunction'에서'$ s0'의 값을 자유롭게 변경할 수 있습니다. 단지 그 값을 나중에 다시 넣기 위해서입니다. –

+0

"기능 B는 사용하기 전에 $ s0을 (를) 저장해야합니다."라는 의미가 정확히 무엇입니까? ... 저장하면 무엇을 의미합니까? $ s0은 이미 저장된 값입니다. 그리고 주 함수 호출은 이미 $ s0을 '저장했습니다'. – ThatProgrammerDude