Регистры общего назначения используются в программах для хранения:
· операндов логических и арифметических операций;
· компонентов адреса;
· указателей на ячейки памяти.
В принципе, все эти регистры доступны для хранения операндов без особых ограничений, хотя при определенных условиях некоторые из них все же имеют жесткое функциональное назначение, закрепленное на уровне логики работы машинных команд. Среди всех этих регистров особо следует выделить регистр esp. Его не следует использовать явно для хранения каких-либо операндов программы, так как в нем хранится указатель на положение вершины стека программы.
Все регистры этой группы позволяют обращаться к своим "младшим" частям (рис. 2.2). Рассматривая этот рисунок, заметьте, что использовать для самостоятельной адресации можно только младшие 16- и 8-битные части этих регистров. Старшие 16 битов этих регистров как самостоятельные объекты недоступны. Это сделано, как мы отметили выше, для совместимости с младшими 16-разрядными моделями микропроцессоров фирмы Intel. Перечислим регистры, относящиеся к группе регистров общего назначения. Так как эти регистры физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), то их еще называют регистрами АЛУ:
· eax/ax/ah/al (Accumulator register) - аккумулятор. Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно;
· ebx/bx/bh/bl (Base register) - базовый регистр. Применяется для хранения базового адреса некоторого объекта в памяти;
· ecx/cx/ch/cl (Count register) - регистр-счетчик. Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды. К примеру, команда организации цикла loop, кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx;
· edx/dx/dh/dl (Data register) - регистр данных. Так же как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.
Следующие два регистра используются для поддержки так называемых цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит:
· esi/si (Source Index register) - индекс источника. Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике;
· edi/di (Destination Index register) - индекс приемника (получателя). Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике.
В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. В свое время мы подробно познакомимся с тем, как его использовать. Для работы со стеком в системе команд микропроцессора есть специальные команды, а в программной модели микропроцессора для этого существуют специальные регистры:
· esp/sp (Stack Pointer register) - регистр указателя стека. Содержит указатель вершины стека в текущем сегменте стека;
· ebp/bp (Base Pointer register) - регистр указателя базы кадра стека. Предназначен для организации произвольного доступа к данным внутри стека.
Не спешите пугаться столь жесткого функционального назначения регистров АЛУ. На самом деле большинство из них может использоваться при программировании для хранения операндов практически в любых сочетаниях. Возможные варианты использования этих регистров приведены в синтаксических диаграммах команд в Справочнике. Но, как мы отметили выше, некоторые команды используют фиксированные регистры для выполнения своих действий. Это нужно обязательно учитывать. Использование жесткого закрепления регистров для некоторых команд позволяет более компактно кодировать их машинное представление. Знание этих особенностей позволит вам при необходимости хотя бы на несколько байт сэкономить память, занимаемую кодом программы.