Соответствующее сохранение регистров при обращении к под-
программе — это существенный момент в программировании на Ассемблере. В современных языках высокого уровня подпрограмма обычно не может изменить значения переменных вызывающей программы, если вызывающая программа этого явным образом не допускает.
В Ассемблере это не так: переменные вызывающей программы хранятся часто
в тех же регистрах, что и регистры, используемые подпрограммой.
Например, если подпрограмма изменяет регистр, значение которого
вызывающая программа установила перед вызовом подпрограммы, но
который она использует после обращения к ней, вы получите ошибку.
Одно из решений этой проблемы состоит в том, чтобы при входе
в каждую подпрограмму заносить в стек все используемые ей регист-
ры и восстанавливать их из стека перед возвратом в вызывающую
программу. К сожалению, для этого требуется существенное время и
большой объем кода. Другая возможность заключается в том, чтобы
ввести правило, что вызывающая программа никогда не рассчитывает
на сохранение регистров подпрограммой и все функции по их сохра-
нению выполняет сама. Но это малопривлекательно, поскольку су-
щественным доводом в пользу применения Ассемблера является свобо-
да эффективного использования регистров.
Если говорить кратко, то в языке Ассемблера существует ко-
нфликт между скоростью и простотой программирования. Если вы со-
бираетесь использовать Ассемблер, вы сможете писать быстрые и
компактные программы, а это означает, что нужно разумно относить-
ся к сохранению регистров и обеспечить, чтобы при вызове каждой
подпрограммы из-за регистров не возникало конфликтов. Наилучшим
подходом является аккуратное комментирование каждой подпрограммы
и указание, какие регистры она использует, и обращение к данным
комментариями при каждом вызове подпрограммы.
Нужно уделять внимание как отслеживанию сохранения регист-
ров, так и максимально эффективному их использованию. В програм-
мировании на Ассемблере это одинаково важно. Языки высокого уров-
ня выполняют за вас эту работу, но они, как мы уже упоминали, не
позволяют получать такие быстрые и компактные программы, какие
можно получить с помощью Ассемблера.
