2017-10-23 8 views
0

저는 MIPS를 배우기 시작한 학생입니다.

나는 $ ra (반송 주소)가 피 호출자가 저장되었는지 (보존되었는지) 온라인으로 검색하고 있습니다. 일부 테이블에는 저장된 피 호출자가 있지만 다른 피신자는 그렇지 않은 것으로 명시되어 있습니다.

$ ra는 호출 수신자 저장된 레지스터라는 의미의 호출 수신자 저장되지 않은 레지스터라고 생각합니다.

$ ra가 callee로 저장된 레지스터이기 때문에 문제가 있다고 생각합니다. jal을 통해 함수 (서브 루틴)를 호출하면, jal 명령 후에 $ ra가 PC + 4로 변경되기 때문에 호출 수신자 함수가 이전 $ ra 값을 보존 할 수있는 방법이 없습니다. 호출자 함수는 미리 $ ra를 스택에 저장해야합니다. 따라서이 경우를 고려하면 $ ra는 발신자 저장 레지스터가됩니다.

맞습니까?

+1

예, 잎이 아닌 함수는'$ ra' 자체를 저장/복원해야합니다. –

+0

@PeterCordes jal 명령 외에도 syscall 명령은 항상 $ ra 레지스터를 보존합니까? 나는 어떤 변화가 있는지보기 위해 노력했지만, $ ra는 syscall 후에 보존 된 것으로 보인다. 나는 그것이 보존되는 방법을 실제로 얻지 못한다 .. –

+0

'syscall'은 반환 주소를 저장하기 위해'$ ra'를 사용하지 않는다; 다른 메커니즘을 사용하여 커널 모드로 전환합니다. '$ ra'을 보존할지 여부는 커널에 달려 있습니다. SPIM 및 MARS 문서에서는 시스템 호출이 반환 값을 제외한 모든 reg를 보존한다고 말합니다. Linux-MIPS 시스템 호출도 마찬가지라고 생각합니다. –

답변

2

맞습니까? 호출 된 함수를 입력하기 전에

jal 명령이 이미 $ra에 값을 기록합니다 : 당신이 이미 발견으로

$ra는 아주 특별한 경우입니다. 따라서 호출 함수는 이미 $ra 레지스터를 "파기"합니다.

누군가가 이미 당신과 매우 유사 질문 질문 그러나

:

Whether $ra register callee saved or caller saved in mips?

한 대답은 호출 된 함수 가 호출하는 함수 을지지 않습니다 수 있도록 $ra 레지스터를 수정하는을 허용 지적을 그 $ra에는 실제로 반송 주소가 포함되어 있습니다. 그 대답에 주어진 예는 다음과 같습니다

move $v0,$ra 
li $ra,0 
jr $v0 

JAL 명령 외에도, 콜 명령은 항상 $ 가시 레지스터를 유지 하는가?

시뮬레이터 (SPIM, MARS, ...)에서 syscall 명령어는 어떤 레지스터에도 액세스하지 않고 하나의 문서에 기록 된 단일 CPU 명령어입니다.

실제 MIPS CPU에서 syscall 명령어는 x86 CPU에서 "소프트웨어 인터럽트"를 유발합니다. 소프트웨어 인터럽트는 특수한 형태의 함수 호출입니다.

는 그러나 jal 명령과 달리 syscall 명령은 $ra 레지스터 만 특별 지시를 사용하여 액세스 할 수 있습니다 (MIPS R4400 CPU에서 EPC 이름) 특수 레지스터에 반환 주소를 기록하지 않습니다.

호출되는 함수 ("예외 처리기")는 물론 레지스터를 수정합니다. 그 함수가 다른 함수를 호출하면 $ra 레지스터가 수정됩니다.

그러나 나는 거의 모든 운영 체제 모든 레지스터하지만, 명시 적으로 문서에 따라 수정하는 것 (리눅스 $v0, $v1$a3의 경우에 syscall에 의해 수정)를 보존 것이라고 생각합니다.