Предыдущий раздел | ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА | Следующий раздел |
Многие исполнительные операторы ассемблера (арифметические, логические, передачи данных, строковые операторы) обрабатывают какие-то данные, являющиеся операндами этих операторов. Эти данные могут находиться в следующих местах: 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) .
Предыдущий раздел | В начало | Следующий раздел |