임시 변수와 저장된 변수가 작동하는 방식에는 차이가 없습니다. 차이점은 그것이 어떻게 사용되는지, 오히려 어떻게 사용해야하는지에 있습니다.
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
레지스터를 저장하고 복원하여 규칙을 준수하고 함수 호출로 덮어 쓰지 않는 경우에만 작동합니다.
$ t가 $ s와 다르게 동작하는 "비교적 간단한 예제"에 대한 포스터의 호소에 회신하려면 myFunction :'addi $ t0, $ 0, 255''jr $ ra'의 정의를 추가하면됩니다. – RobertB
@RobertB 나는 그것이 지나치게 혼란 스러울 것이라고 생각할 것이다. 사용자는'myFunction'에서'$ s0'의 값을 자유롭게 변경할 수 있습니다. 단지 그 값을 나중에 다시 넣기 위해서입니다. –
"기능 B는 사용하기 전에 $ s0을 (를) 저장해야합니다."라는 의미가 정확히 무엇입니까? ... 저장하면 무엇을 의미합니까? $ s0은 이미 저장된 값입니다. 그리고 주 함수 호출은 이미 $ s0을 '저장했습니다'. – ThatProgrammerDude