Регистр sp
- это указатель стека, используемый для операций со стеком, таких как push
и pop
.
Стек известен как структура LIFO («последний вошел, первый вышел»), что означает, что последнее, что было добавлено, - это то, что сорвало кулак. Он используется, помимо прочего, для реализации возможности вызова функций.
Регистр bp
является базовым указателем и обычно используется для операций со стеком.
Это означает, что это фиксированная ссылка для поиска локальных переменных, переданных параметров и т. Д. В стеке для заданного уровня (в то время как sp
может изменяться во время выполнения функции, bp
обычно не изменяется).
Если вы смотрите на ассемблере, например:
mov eax, [bp+8]
вы видите, как код обращается к переменной, зависящей от уровня стека.
Регистр si
является исходным индексом, обычно используемым для операций массового копирования (di
является его эквивалентным целевым индексом). Intel имеет эти регистры вместе со специальными инструкциями для быстрого перемещения байтов в памяти.
Варианты e-
- это всего лишь 32-битные версии этих (изначально) 16-битных регистров. И, как будто этого было недостаточно, у нас также есть 64-битные r-
варианты: -)
Пожалуй, самое простое место для начала это здесь . Это специфично для 8086, но концепции не сильно изменились. Простота модели 8086 по сравнению с нынешним урожаем станет хорошей отправной точкой для вашего образования. Как только вы изучите основы, вам будет гораздо легче перейти к более поздним членам семейства x86.
Переписано здесь и немного отредактировано, чтобы сделать ответ автономным.
РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ
8086 CPU имеет 8 регистров общего назначения, каждый из которых имеет свое имя:
AX
- регистр аккумулятора (делится на AH/AL
). Вероятно, наиболее часто используемый регистр для общего назначения.
BX
- регистр базовых адресов (делится на BH/BL
).
CX
- регистр счета (делится на CH/CL
). Специальные инструкции по наведению и сдвигу.
DX
- регистр данных (делится на DH/DL
). Используется с AX
для некоторых операций MUL
и DIV
и для указания портов в некоторых операциях IN
и OUT
.
SI
- регистр исходного индекса. Специальная инструкция для использования в качестве источника массовой памяти (DS:SI
).
DI
- регистр индекса назначения. Специальная инструкция для использования в качестве места назначения массовой памяти (ES:DI
).
BP
- базовый указатель, в основном используемый для доступа к параметрам и переменным в стеке.
SP
- указатель стека, используемый для основных операций стека.
РЕГИСТРЫ СЕГМЕНТА
CS
- указывает на сегмент, содержащий текущую инструкцию.
DS
- обычно указывает на сегмент, где определены переменные.
ES
- регистр дополнительного сегмента, кодер определяет его использование.
SS
- указывает на сегмент, содержащий стек.
Хотя в сегментных регистрах можно хранить любые данные, это никогда не является хорошей идеей. Сегментные регистры имеют особую цель - указывать на доступные блоки памяти.
Сегментные регистры работают вместе с регистром общего назначения для доступа к любому значению памяти. Например, если мы хотим получить доступ к памяти по физическому адресу 12345h
, мы могли бы установить DS = 1230h
и SI = 0045h
. Таким образом, мы можем получить доступ к гораздо большему объему памяти, чем с одним регистром, который ограничен 16-битными значениями.
Процессор вычисляет физический адрес, умножая регистр сегмента на 10h
и добавляя в него регистр общего назначения (1230h * 10h + 45h = 12345h
):
1230
0045
=====
12345
Адрес, сформированный из 2 регистров, называется эффективным адресом.
Это использование только для реального режима (это единственный режим, который имел 8086).Более поздние процессоры изменили эти регистры с сегментов на селекторы, и они используются для поиска адресов в таблице, вместо того, чтобы выполнять фиксированные вычисления над ними.
По умолчанию регистры BX
, SI
и DI
работа с DS
сегментным регистром;и BP
и SP
работают с сегментным регистром SS
.
РЕГИСТРЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ
IP
- указатель инструкции:
- Всегда указывает на следующую инструкцию, которая будет выполнена.
- Адрес смещения относительно
CS
.
IP
регистр всегда работает вместе с CS
регистром сегмента ион указывает на выполняемую в данный момент инструкцию.
FLAGS REGISTER
Определяет текущее состояние процессора.Эти флаги автоматически изменяются ЦП после математических операций, это позволяет определить тип результата и определить условия для передачи управления другим частям программы.
Как правило, вы не можете получить доступ к этим регистрам напрямую.
- Флаг переноса
CF
- этот флаг устанавливается в 1, когда происходит переполнение без знака.Например, при добавлении байтов 255 + 1 (результат не находится в диапазоне 0 ... 255).Если переполнения нет, этот флаг устанавливается на 0. - Флаг четности
PF
- этот флаг устанавливается на 1, когда в результате есть четное число из одного бита, и на 0, если есть нечетное числоодин бит. - Вспомогательный флаг
AF
- установить на 1, когда есть переполнение без знака для низкого куска (4 бита). - Нулевой флаг
ZF
- установить на 1, когда результат равен нулю.Для ненулевого результата этот флаг установлен на 0. - Sign Flag
SF
- установлен на 1, если результат отрицательный.Если результат положительный, он устанавливается на 0. (Этот флаг принимает значение старшего значащего бита.) - Флаг прерывания
TF
- Используется для отладки на кристалле. - Разрешение прерыванияФлаг
IF
- когда этот флаг установлен в 1, CPU реагирует на прерывания от внешних устройств. - Флаг направления
DF
- этот флаг используется некоторыми инструкциями для обработки цепочек данных, когда этот флаг установлен в0 - обработка выполняется вперед, когда этот флаг установлен в 1, обработка выполняется в обратном направлении. - Флаг переполнения
OF
- устанавливается в 1 при переполнении со знаком.Например, при добавлении байтов 100 + 50 (результат не находится в диапазоне -128 ... 127).