2009-11-05 5 views
1

MIPS 레지스터는 $ 1 레지스터가 서브 루틴 호출간에 유지되므로 $ t 레지스터가 유지되지 않는 동안 서브 루틴이이를 수정하면 스택에 저장해야합니다.

이제 syscall이 $ t 레지스터를 잠재적으로 수정할 수 있습니까? 내가 가진 시뮬레이터에서는 그렇지 않지만 진짜 기계가 잠재적으로 $ t 레지스터를 변경시킬 수 있습니까? $ t 레지스터가 syscall에서 동일하게 유지된다고 가정하는 것이 안전한지 알고 싶기 때문에 묻습니다.

+2

어떤 운영 체제가 필요합니까? 특정 OS의 구현에 의존하지 않습니까? –

답변

2

문서화되지 않은 한 특정 레지스터를 유지하는 것이 좋습니다.

syscall의 doco가 특정 레지스터 만 수정한다고 명시하면 코드와 계약을 맺습니다. 계약서를 어기면 버그입니다 (개발자를 기다리는 것보다는 코드를 수정하는 것이 더 쉽지만). 종류가 명시되지 않은 경우 에 따라 달라 지거나 규칙에 위배되지 않습니다.

잘 쓰여지는 전화는 모두 정보를 반환하는 데 특별히 사용되지 않는 레지스터를 보존합니다. 그러나 확실하지 않은 경우 등록을 유지해야하는 경우 시스템 콜을 호출하기 전에 직접 해보십시오.

1

이제 syscall이 $ t 레지스터를 수정할 수 있습니까?

예!

물론 운영 체제의 syscall 인터페이스는 이러한 모든 레지스터를 보존 할 수 있습니다. 그러나 시스템 콜이 일 수없는 기술적 인 이유는 없습니다.을 수정하십시오. OS 설명서를 확인하십시오.