Адресация операндов, находящихся в памяти

Ячейка памяти адресуется с помощью селектора сегмента (сегментного регистра) и смещения (OFFSET). Смещение может быть 32-х разрядным или 16-ти разрядным. Формирование линейного адреса происходит согласно рисунку 30.

Рисунок 9 – Схема формирования адреса в процессорах IA32

Селектор сегмента – определяется сегментным регистром. По умолчанию приняты следующие правила использования сегментных регистров:

CS – указатель на сегмент кода, по умолчанию используется для выборки команд

DS – указатель на сегмент данных, по умолчанию используется для всех обращений к данным, за исключением операций со стеком и строками

SS – указатель на сегмент стека, по умолчанию используется для обращения к стеку, а также при обращении к памяти с использованием регистров ESP или EBP в качестве базовых регистров.

ES – указатель на дополнительный сегмент данных, по умолчанию используется для адресации строк.

При необходимости можно указывать название сегментного регистра в команде (на машинном уровне, формируется соответствующий префикс команды), например: необходимо сохранить данные в сегмент, адрес которого указан в ES

Mov es:[ebx], eax – содержимое регистра eax запишется в сегмент, указанный в es со смещением, равным содержимому ebx

Следующие типы адресации определяются способом вычисления смещения:

Прямая – смещение указывается непосредственно в команде

Mov ax, es:0001 – в регистр ах загружается слово из сегмента памяти на который указывает регистр es, смещение равно 0001. При написании программ, вместо цифрового представления адреса используется символьное обозначение ячейки, т.е. имя переменной. Компилятор, на этапе преобразования исходного текста программы в машинный код, самостоятельно вычислит смещения каждой объявленной переменной относительно начала сегмента, и в программе будет использовать этот, вычисленный, адрес. Т.е. команды будет выглядеть следующим образом

Mov ax, peremennaya, где peremennaya – имя переменной.

Косвенная – тип адресации, при которой смещение операнда относительно начала сегмента указывается неявно. Разбивается на несколько подтипов:

Базовая – указывается только базовый регистр

Например:

Mov [<базовый регистр>], <источник>

Базовая со смещением (displacement) – указывается базовый регистр и смещение относительно его содержимого

Например:

Mov [<базовый регистр >+<число>], <источник>

Индексная с масштабированием и смещением – указывается индексный регистр, число, определяющее масштаб (2,4 или 8) и смещение

Например:

Mov [<индексный регистр>*<масштаб 2, 4 или 8> + <число>], <источник>

Базово-индексная со смещением – указывается базовый регистр, индексный и смещение

Mov [<базовый регистр >+<индексный регистр> + <число>], <источник>

Базовая с масштабируемым индексом и смещением – включает в себя базовый регистр, индексный регистр, масштаб и смещение.

Mov [<базовый регистр>+<индексный регистр>*<масштаб 2, 4 или 8> + <число>], <источник>


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: