Главная /
Ассемблер /
Для чайников /
Введение в Ассемблер /
Регистры процессора
Начиная с модели 80386 процессоры Intel предоставляют 16 основных регистров для
пользовательских программ и ещё 11 регистров для работы с мультимедийными приложениями (MMX)
и числами с плавающей точкой (FPU/NPX). Все команды так или иначе изменяют содержимое регистров.
Как уже говорилось, обращаться к регистрам быстрее и удобнее, чем к памяти.
Поэтому при программировании на языке Ассемблера регистры используются очень широко.
В этом разделе мы рассмотрим основные регистры процессоров Intel. Названия и
состав/количество регистров для других процессоров могут отличаться. Итак, основные
регистры процессоров Intel.
Таблица 2.1. Основные регистры процессора.
Название |
Разрядность |
Основное назначение |
EAX |
32 |
Аккумулятор |
EBX |
32 |
База |
ECX |
32 |
Счётчик |
EDX |
32 |
Регистр данных |
EBP |
32 |
Указатель базы |
ESP |
32 |
Указатель стека |
ESI |
32 |
Индекс источника |
EDI |
32 |
Индекс приёмника |
EFLAGS |
32 |
Регистр флагов |
EIP |
32 |
Указатель инструкции (команды) |
CS |
16 |
Сегментный регистр |
DS |
16 |
Сегментный регистр |
ES |
16 |
Сегментный регистр |
FS |
16 |
Сегментный регистр |
GS |
16 |
Сегментный регистр |
SS |
16 |
Сегментный регистр |
Регистры EAX, EBX, ECX, EDX – это регистры общего назначения. Они имеют
определённое назначение (так уж сложилось исторически), однако в них можно хранить
любую информацию.
Регистры EBP, ESP, ESI, EDI – это также регистры общего назначения. Они имеют уже
более конкретное назначение. В них также можно хранить пользовательские данные,
но делать это нужно уже более осторожно, чтобы не получить «неожиданный» результат.
Регистр флагов и сегментные регистры требуют отдельного описания и будут более
подробно рассмотрены далее.
Пока для вас здесь слишком много непонятных слов, но со временем всё прояснится)))
Когда-то процессоры были 16-разрядными, и, соответственно, все их регистры были
также 16-разрядными. Для совместимости со старыми программами, а также для удобства
программирования некоторые регистры разделены на 2 или 4 «маленьких» регистра,
у каждого из которых есть свои имена. В таблице 2.2 перечислены такие регистры.
Вот пример такого регистра.
Из этого следует, что вы можете написать в своей программе, например, такие команды:
MOV AX, 1
MOV EAX, 1
Обе команды поместят в регистр AX число 1. Разница будет заключаться только в том,
что вторая команда обнулит старшие разряды регистра EAX, то есть после выполнения
второй команды в регистре EAX будет число 1. А первая команда оставит в старших
разрядах регистра EAX старые данные. И если там были данные, отличные от нуля,
то после выполнения первой команды в регистре EAX будет какое-то число, но не 1.
А вот в регистре AX будет число 1. Сложно? Ну это пока… Со временем вы к таким вещам привыкните.
Мы пока не говорили о разрядах (битах). Эту тему мы обсудим в разделах, посвящённых
системам счисления. А сейчас пока вам достаточно знать, что нулевой разряд (бит) – это
младший бит. Он крайний справа. Старший бит – крайний слева. Номер старшего бита
зависит от разрядности числа/регистра. Например, в 32-разрядном регистре старшим
битом является 31-й бит (потому что отсчёт начинается с 0, а не с 1).
Ниже приведён список регистров общего назначения, которые можно поделить описанным
выше способом и при этом к «половинкам» и «четвертинкам» этих регистров можно
обращаться в программе как к отдельному регистру.
Таблица 2.2. «Делимые» регистры..
Регистр |
Старшие разряды |
Имена 16-ти и 8-ми битных регистров |
31…16 |
15…8 |
7…0 |
EAX |
... |
AX |
AH |
AL |
EBX |
... |
BX |
BH |
BL |
ECX |
... |
CX |
CH |
CL |
EDX |
... |
DX |
DH |
DL |
ESI |
... |
SI |
EDI |
... |
DI |
EBP |
... |
BP |
ESP |
... |
SP |
EIP |
... |
IP |
На этом мы закончим наше краткое знакомство с регистрами. Если вам пока не всё
понятно – просто прочитайте этот раздел, чтобы более-менее представлять себе,
что такое регистры. По мере приобретения новых знаний вы можете вернуться к этому
разделу и уже на новом уровне воспринять эту информацию. А в следующем разделе
мы коротко опишем
процесс выполнения команды.