맞습니까? 호출 된 함수를 입력하기 전에
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
에 의해 수정)를 보존 것이라고 생각합니다.
예, 잎이 아닌 함수는'$ ra' 자체를 저장/복원해야합니다. –
@PeterCordes jal 명령 외에도 syscall 명령은 항상 $ ra 레지스터를 보존합니까? 나는 어떤 변화가 있는지보기 위해 노력했지만, $ ra는 syscall 후에 보존 된 것으로 보인다. 나는 그것이 보존되는 방법을 실제로 얻지 못한다 .. –
'syscall'은 반환 주소를 저장하기 위해'$ ra'를 사용하지 않는다; 다른 메커니즘을 사용하여 커널 모드로 전환합니다. '$ ra'을 보존할지 여부는 커널에 달려 있습니다. SPIM 및 MARS 문서에서는 시스템 호출이 반환 값을 제외한 모든 reg를 보존한다고 말합니다. Linux-MIPS 시스템 호출도 마찬가지라고 생각합니다. –