
Регистры процессора.
Процессор работает с данными. Обрабатываемые данные содержаться в оперативной памяти, куда считываются с жёсткого диска. Для того, чтобы ими манипулировать, а также верно организовывать свою работу по их обработке — выполнению программного кода, у процессора имеется система, построенная на небольших, но очень быстрых блоках памяти — регистров. Регистры процессора — это входящие непосредственно в процессор блоки памяти.
Изучать регистры процессора мы будем с использованием отладчика TD (Turbo Debugger) и нашей первой программы «Hello, world!» (prg.com). Так что запускаем предустановленный DOSBox и поехали (всё необходимое имеется в архиве DOS-1.rar, который можно скачать с нашего сайта).

Для удобства работы с Turbo Debugger целесообразно увеличить рабочую площадь программы на всё окно.

Регистры процессора Intel и их аналоги.
Количество регистров и их размер зависит от разрядности и сложности процессора.
Практически при написании кода регистры нужно понимать как постоянно имеющиеся под рукой программиста переменные.
Начиная с 80386, процессоры Intel и их аналоги имеют 16 основных регистров и 11 регистров для работы с числами с плавающей запятой (FPU/NPX) и мультимедийными приложениями (MMX). Для машины всегда быстрее и удобнее обращаться к регистру процессора, чем к памяти.
Помимо основных регистров существуют регистры управления памятью (GDTR, IDTR, TR, LDTR), регистры управления (CR0, CR1 – CR4), отладочные регистры (DR0 – DR7) и машинно-зависимые регистры, которые практически не используются в прикладном программировании.
Регистры процессора 8086.
Так как мы имеем дело с 16 битной операционной системой MS-DOS, то вернёмся во времена процессоров 8086 и 80286. В процессорах следующих поколений указанные регистры являются частями соответствующих 32 и 64 битных регистров с сохранением названия и функционала.
Например, регистр ax (16 бит) является составляющей частью регистра eax (32 бита). Благодаря указанному подходу достигается совместимость работы старых программ на новых компьютерах. Также сохраняются команды и директивы, переходя с 16 битного в 32 битный код.
Итак, процессор (8086 и 80286) содержит 12 16-ти разрядных программно-адресуемых регистров. Регистры процессора принято объединять в три группы:
- Регистры данных.
- Регистры указатели.
- Сегментные регистры.
Кроме этого, в состав процессора входят:
- Счётчик команд.
- Регистр флагов.
16-ти разрядность обозначает, что в каждом регистре может содержаться 0FFFFh бит информации, то есть два байта: 0FFh-0FFh информации.
Регистры данных (регистры общего назначения).
Регистры данных допускают независимое обращение к старшим (High — обозначается литерой H) и младшим (Lough — обозначается литерой L) половинам.
1 2 3 4 | AX (AH+AL) - Аккумулятор (Accumulator). BX (BH+BL) - Базовый регистр (Base). CX (CH+CL) - Счетчик (Counter). DX (DH+DL) - Регистр данных (Data). |
Регистры данных эквивалентны в использовании. Во времена старых процессоров, рекомендовалась использовать в первую очередь AX, так как многие команды, если их операндом (составной частью команды) является AX (AH, AL) занимают в памяти меньше места и выполняются быстрее.
Регистры указатели.
Регистры указатели в отличие от регистров общего назначения не допускают побайтовую адресацию. SI и DI называют индексными регистрами.
1 2 3 4 | SI - Индекс имточника (Source Index). DI - Индекс приёсемка (Destination Index). BP - Указатель базы (Base Pointer). SP - Указатель стека (Stack Pointer). |
Регистры указатели в принципе также могут использоваться в любых целях, как и регистры общего назначения. В некоторых командах (работы со строками) используется конкретный установленный перечень регистров. Например, команда movs — «пересылка строк» предполагает использование исключительно регистров SI и DI для хранения адресов источника и приемника строки байт, слов и двойных слов. В случае использования префикса rep, дополнительно задействуется сегмент CX.
Сегментные регистры.
Сегментные регистры хранят начальные адреса сегментов программы, что даёт возможность обращаться к этим сегментам.
1 2 3 4 | CS - Регистр сегмента команд (Commands Segment). DS - Регистр сегмента данных(Data Segment). ES - Регистр дополнительного сегмента данных (Extantion Segment). SS - Регистр сенмента стека (Stack Segment). |
Счётчик команд.
1 | IP - Указатель команд (Index Pointer). |
На каждом шаге выполнения программы указывает на адрес команды, следующей за исполняемой. Регистр IP программно не доступен. Можно только получить его значение (и то, не на прямую), программно влиять на IP — не возможно.
Регистр флагов.
1 | CF - Регистр флагов (Flags). |
Побитно содержит флаги : OF, DF, IF, TF, SF, ZF, AF,PF, CF. Флаги устанавливаются процессором и на них можно влиять программно. Определенные команды влияют на изменение значения флага. Например, флаг нуля (ZF) устанавливается в 1, если результат операции равен нулю. Так, если в AX содержится число 1, то после команды
1 | dec ax |
содержимое AX станет равным 0, а в регистре флагов установится бит ZF.
Используем отладчик для усвоения материала.
С помощью Turbo Debugger самостоятельно изучите рассмотренные регистры процессора, отлаживая нашу первую программу prg.com.
