2009-11-05 3 views
1

Регистры MIPS имеют соглашение - регистры $ s должны быть сохранены для вызовов подпрограмм, поэтому, если ваша подпрограмма их модифицирует, она должна сохранять их в стек, а регистры $ t не сохраняются.

Теперь, может ли syscall потенциально изменить регистр $ t? В симуляторе у меня это не так, но может ли реальная машина изменить регистры $ t? Я спрашиваю, потому что хочу знать , можно ли предположить, что регистр $ t останется тем же самым в syscall.

+2

Что такое операционная система? Не будет ли это зависеть от реализации конкретной ОС? –

ответ

2

Это не разумно, если не задокументировано, полагаться на любой вызов, сохраняющий определенные регистры.

Если doco для syscall указывает, что он изменяет только определенные регистры, это контракт с вашим кодом. Если он нарушает этот контракт, это ошибка (хотя, вероятно, вам легче исправить свой код, чем ждать разработчика). Если в нем ничего не указано, не зависит от него, конвенции или иным образом.

Хорошо записанные звонки сохранят все регистры, которые специально не используются для возврата информации. Но, если вы не уверены, и вам нужен этот регистр, сохраните его, сделайте это самостоятельно, прежде чем вызывать syscall.

1

Теперь, может ли syscall потенциально изменить регистр $ t?

Да!

Конечно, интерфейс syscall вашей операционной системы может сохранять все эти регистры. Но нет никакой технической причины, почему syscall не может изменить их. Проверьте документацию вашей ОС.

Смежные вопросы