Регистры общего назначения: AX, BX, CX и DX

При программировании на Ассемблере регистры общего назначения являются «рабочими лошадками». Особенность этих регистров состоит в том, что возможна адресация их как одного целого слова или как oднобайтовой части. Левый байт является старшей частью (high), a правый — младшей частью (low). Например, двухбайтовый регистр CX состоит из двух однобайтовых: CH и CL, и ссылки на регистр возможны по любому из этих трех имен. Следующие три ассемблерные команды засылают нули в регистры CX, CH и CL, соответственно:

MOV CX,00

MOV CH,00

MOV CL,00

Регистр AX

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

Некоторые команды генерируют более эффективный код, если они имеют ссылки на регистр AX.

AX: | AH | AL |

Регистр BX

Регистр BX является базовым регистром. Это единственный регистр общего назначения, который может использоваться в качестве «индекса» для расширенной адресации. Другое общее применение его — вычисления.

BX: | BH | BL |

Регистр CX

Регистр CX является счетчиком. Он необходим для управления числом повторений циклов и для операций сдвига влево или вправо. Регистр CX используется также для вычислений.

CX: | CH | CL |

Регистр DX

Регистр DX является регистром данных. Он применяется для некоторых операций ввода/вывода и тех операций умножения и деления над большими числами, которые используют регистровую пару DX и AX.

DX: | DH | DL |

Любые регистры общего назначения могут использоваться для cложения и вычитания как 8-ми, так и 16-ти битовых значений.

Регистровые указатели: SP и BP

Регистровые указатели SP и BP обеспечивают системе доступ к данным в сегменте стека. Реже они используются для операций сложения и вычитания.

Регистр SP

Указатель стека обеспечивает использование стека в памяти, позволяет временно хранить адреса и иногда данные.

Этот регистр связан с регистром SS для адресации стека.

Регистр BP

Указатель базы облегчает доступ к параметрам: данным и адресам переданным через стек.

Индексные регистры: SI и DI

Оба индексных регистра возможны для расширенной адресации и для использования в операциях сложения и вычитания.

Регистр SI

Этот регистр является индексом источника и применяется для некоторых операций над строками. В данном контексте регистр SI связан с регистром DS.

Регистр DI

Этот регистр является индексом назначения и применяется также для строковых операций. В данном контексте регистр DI связан с регистром ES.

Регистр командного указателя: IP

Регистр IP содержит смещение на команду, которая должна быть выполнена. Обычно этот регистр в программе не используется, но он может изменять свое значение при использовании отладчика DOS DEBUG для тестирования программы.

Флаговый регистр

Девять из 16 битов флагового регистра являются активными и определяют текущее состояние машины и результатов выполнения. Многие арифметические команды и команды сравнения изменяют состояние флагов.

Назначение флаговых битов

O (Переполнение)

Указывает на переполнение старшего бита при арифметических командах.

D (Направление)

Обозначает левое или правое направление пересылки или сравнения строковых данных (данных в памяти превышающих длину одного слова).

I (Прерывание)

Указывает на возможность внешних прерываний.

T (Пошаговый режим)

Обеспечивает возможность работы процессора в пошаговом режиме. Например, программа DOS DEBUG устанавливает данный флаг так, что возможно пошаговое выполнение каждой команды для проверки изменения содержимого регистров и памяти.

S (Знак)

Содержит результирующий знак после арифметических операций (0 — плюс, 1 — минус).

Z (Ноль)

Показывает результат арифметических операций и операций сравнения (0 — ненулевой, 1 — нулевой результат).

A (Внешний перенос)

Содержит перенос из 3-го бита для 8-битных данных используется для специальных арифметических операций.

P (Контроль четности)

Показывает четность младших 8-битовых данных (1 — четное и 0 — нечетное число).

C (Перенос)

Содержит перенос из старшего бита, после арифметических операций, а также последний бит при сдвигах или циклических сдвигах. При программировании на Ассемблере наиболее часто используются флаги O, S, Z, и C для арифметических операций и операций сравнения, а флаг D для обозначения направления в операциях над строками.

Лекция 4.
Арифметические операции

Обработка двоичных данных

Несмотря на то, что мы привыкли к десятичной арифметике (база 10), компьютер работает только с двоичной арифметикой (база 2). Кроме того, ввиду ограничения, накладываемого 16-битовыми регистрами, большие величины требуют специальной обработки.

Сложение и вычитание

Команды ADD и SUB выполняют сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание выполняется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения бит и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.

Поскольку прямой операции память-память не существует, данная oперация выполняется через регистр. В следующем примере к содержимому слова WORDB прибавляется содержимое слова WORDA, описанных как DW:

MOV AX,WORDA

ADD AX,WORDB

MOV WORDB,AX

Переполнения

Опасайтесь переполнений в арифметических операциях. Один байт содержит знаковый бит и семь бит данных, то есть, значения от -128 до +127.

Результат арифметической операции может легко превзойти емкость однобайтового регистра. Например, результат сложения в регистре AL, превышающий его емкость, автоматически не переходит в регистр AH.

Предположим, что регистр AL содержит шест.60, тогда результат команды

ADD AL,20H

генерирует в AL сумму — шест.80. Но операция также устанавливает флаг переполнения и знаковый флаг в состояние «отрицательно». Причина заключается в том, что шест.80 или двоичное 1000 0000 является отрицательным числом, то есть, в результате, вместо +128, мы получим -128.

Так как регистр AL слишком мал для такой операции и следует воспользоваться регистром AX.

В следующем примере команда CBW (Convert Byte to Word — преобразовать байт в слово) преобразует шест.60 в регистре AL в шест.0060 в регистре AX, передавая при этом знаковый бит (0) через регистр AH.

Команда ADD генерирует теперь в регистре AX правильный результат: шест.0080, или +128:

CBW ;Расширение AL до AX

ADD AX,20H ;Прибавить к AX

Но полное слово имеет также ограничение: один знаковый бит и 15 бит данных, что соответствует значениям от -32768 до +32767.

Наши рекомендации