Сохранение регистров


Соответствующее сохранение регистров при обращении к под-

программе — это существенный момент в программировании на Ассемблере. В современных языках высокого уровня подпрограмма обычно не может изменить значения переменных вызывающей программы, если вызывающая программа этого явным образом не допускает.

В Ассемблере это не так: переменные вызывающей программы хранятся часто

в тех же регистрах, что и регистры, используемые подпрограммой.

Например, если подпрограмма изменяет регистр, значение которого

вызывающая программа установила перед вызовом подпрограммы, но

который она использует после обращения к ней, вы получите ошибку.

Одно из решений этой проблемы состоит в том, чтобы при входе

в каждую подпрограмму заносить в стек все используемые ей регист-

ры и восстанавливать их из стека перед возвратом в вызывающую

программу. К сожалению, для этого требуется существенное время и

большой объем кода. Другая возможность заключается в том, чтобы

ввести правило, что вызывающая программа никогда не рассчитывает

на сохранение регистров подпрограммой и все функции по их сохра-

нению выполняет сама. Но это малопривлекательно, поскольку су-

щественным доводом в пользу применения Ассемблера является свобо-

да эффективного использования регистров.

Если говорить кратко, то в языке Ассемблера существует ко-

нфликт между скоростью и простотой программирования. Если вы со-

бираетесь использовать Ассемблер, вы сможете писать быстрые и

компактные программы, а это означает, что нужно разумно относить-

ся к сохранению регистров и обеспечить, чтобы при вызове каждой

подпрограммы из-за регистров не возникало конфликтов. Наилучшим

подходом является аккуратное комментирование каждой подпрограммы

и указание, какие регистры она использует, и обращение к данным

комментариями при каждом вызове подпрограммы.

Нужно уделять внимание как отслеживанию сохранения регист-

ров, так и максимально эффективному их использованию. В програм-

мировании на Ассемблере это одинаково важно. Языки высокого уров-

ня выполняют за вас эту работу, но они, как мы уже упоминали, не

позволяют получать такие быстрые и компактные программы, какие

можно получить с помощью Ассемблера.

Загрузка...