Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.3. Адресация данных

Многие исполнительные операторы ассемблера (арифметические, логические, передачи данных, строковые операторы) обрабатывают какие-то данные, являющиеся операндами этих операторов. Эти данные могут находиться в следующих местах: 1) в регистрах; 2) в ОП – в поле машинной команды, их обрабатывающей; 3) в ОП – вне машинных команд.

1) Регистровая адресация. Обрабатываемое данное находится в регистре. В следующем операторе оба операнда используют такую адресацию:

mov      ax, bx

2) Непосредственная адресация. Пример оператора, второй операнд которого содержит непосредственные данные:

mov      ax, 2

Непосредственно адресуемый операнд помещается в поле машинной команды, занимая в зависимости от типа команды один или два байта. Например, для приведенного выше оператора ассемблера соответствующая машинная команда имеет вид: b80200, где  b8h - КОП, а два байта данных (02h и 00h) следуют за ним (младщий байт слова расположен первым в памяти). Данные, задаваемые в операторе непосредственно, можно только читать, но менять их нельзя.

Все остальные типы адресации предназначены для работы с данными, находящимися в ОП вне сегмента кодов. Основным местом, предназначенным  для хранения таких данных является сегмент данных (рис.95). Местоположение любого байта или слова данных однозначно задается смещением L относительно начала сегмента данных. С учетом того, что регистр сегмента данных DS содержит начальный параграф сегмента данных, реальный адрес соответствующей ячейки в ОП:    R = (DS) x 16 + L.

 

Рис. 95. Расположение сегмента данных в ОП

 

Различные способы (режимы) адресации отличаются друг от друга тем, как они задают смещение L. Вот некоторые из них.

3) Прямая адресация. 16-битное смещение L является частью исполнительного оператора. Пример:

mov       [Max], al        ,

где Мax – метка ячейки в сегменте данных. В поле машинной команды находится 16-битное слово, содержащее L для байта, помеченного в исходной программе как Мax.

4) Регистровая косвенная адресация. Искомое смещение L находится или в базовом регистре ВХ или в индексном регистре (DI или SI). Регистр задается в операторе ассемблера, заключенным в квадратные скобки. Например, следующий оператор

mov  [bx], dx

пересылает содержимое регистра DX в ячейку (слово) ОП, адрес которой находится в регистре ВХ.

5) Относительная регистровая адресация. Это «гибрид» прямой и регистровой косвенной адресации для получения L. К заданному в операторе смещению прибавляется содержимое базового или индексного регистра. Смещение можно задать двумя способами: а) меткой; б) непосредственно, т.е. числом. Примеры:

a)              mov      [Max+bx],dx   ,

cодержимое регистра DX записывается в слово ОП, смещение L для которого получается путем суммирования смещения для метки МАХ с содержимым регистра ВХ;

   б)              mov      [10+bx], dx      ,

содержимое DX записывается в ячейку ОП, имеющую  L=10+(BX) .

6) Базовая индексная адресация. Смещение L равно сумме содержимых базового регистра ВХ и индексного (SI или DI), заданных в операнде. Пример:

mov      al, [bx+si]             ,

содержимое байта ОП, имеющего L=(BX)+(SI), переписывается в регистр AL.

7) Относительная базовая индексная адресация. Смещение L равно сумме трех слагаемых: а) заданного в операторе смещения; б) содержимого базового регистра ВХ; в) содержимого индексного регистра SI или DI. Примеры:

a)            mov       al, [Max+bx+di]         ,

          L = смещение для Мax + (BX) + (DI) .

    б)              mov     al, [10+bx+di]            ,

          L = 10+(BX)+(DI) .

 


Предыдущий раздел В начало Следующий раздел