DS (начальное положение), ES
Рис.3.4
Таблица 3.1. Состав основных полей префикса сегмента программы
|
0h |
DW |
Команда INT 20 ( 16-ный код: CD 20) - вызов прерывания DOS для завершения программы и возврата в DOS |
|
2h |
DW |
Размер доступной для программы памяти в параграфах |
|
0Eh |
DD |
Адрес обработчика прерывания по Ctrl^Break (INT 23h) |
|
12h |
DD |
Адрес обработчика прерывания по критической ошибке (INT 24h) |
|
2Ch |
DW |
Значение сегментного адреса среды окружения |
|
80h |
64W |
DTA –буферная область данных / адрес начала командной строки программы |
Большинство команд процессора Intel Х86 выполняются с аргументами, которые принято называть операндами. Операнды в программе могут задаваться следующим образом:
в регистрах общего назначения;
непосредственно в коде команды;
в ячейках памяти, задаваемых в команде прямо или косвенно;
в портах ввода-вывода.
Для указания места расположения операнда используются 8 режимов адресации, использование которых иллюстрируется в таблице 3.2.
Операнды могут располагаться в любых регистрах общего назначения и сегментных регистрах. В этом случае в операторе программы (на языке ассемблера) указывается название соответствующего регистра.
Некоторые команды (пересылки, все арифметические команды, кроме деления) позволяют указывать один из операндов непосредственно в операторе программы.
Если известен адрес операнда, располагающегося в памяти, можно использовать этот адрес. В реальных программах обычно для задания статических переменных используют директивы определения данных, которые позволяют ссылаться на статические переменные не по адресу, а по имени.
Если селектор сегмента данных находится в DS, имя сегментного регистра при прямой адресации можно не указывать, так как DS используется по умолчанию. Прямая адресация иногда называется адресацией по смещению.
Адрес операнда в памяти можно не указывать непосредственно, а хранить в любом регистре. До процессоров i80386 для этого можно было использовать только регистры ВХ, SI, DI и ВР, но потом эти ограничения были сняты и адрес операнда разрешили считывать также и из ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ЕВР и ESP (но не из AX, CX, DX или SP напрямую – надо использовать ЕАХ, ЕСХ, EDX, ESP соответственно или предварительно скопировать смещение в ВХ, S1, DI или ВР). Как и в случае прямой адресации, DS используется по умолчанию, но не во всех случаях: если смещение берут из регистров ESP, ЕВР или ВР, то в качестве сегментного регистра используется SS. В реальном режиме можно свободно пользоваться всеми 32-битными регистрами, надо только следить, чтобы их содержимое не превышало границ 16-битного слова.
5-6. Базовая или индексная адресация.
Такая форма адресации используется в тех случаях, когда в регистре находится адрес начала структуры данных, а доступ надо осуществить к какому-нибудь элементу этой структуры. Другое важное применение адресации по базе со сдвигом – доступ из подпрограммы к параметрам, переданным в кадре стека, используя регистр ВР (ЕВР) в качестве базы и номер параметра в качестве смещения.
До процессора i80386 в качестве базового регистра можно было использовать только регистры ВХ, ВР, SI или DI и сдвиг мог быть только байтом или словом (со знаком). Начиная с процессоров i80386 и старше, можно дополнительно использовать ЕАХ, ЕВХ, ЕСХ, EDX, ЕВР, ESP, ESI и EDI, так же как и для обычной косвенной адресации. С помощью этого метода можно организовывать доступ к одномерным массивам байт: смещение соответствует адресу начала массива, а число в регистре – индексу элемента массива, который надо использовать. Очевидно, что если массив состоит не из байт, а из слов, придется умножать базовый регистр на два, а если из двойных слов – на четыре. Для этого предусмотрен следующий специальный метод адресации.
Этот метод адресации полностью идентичен предыдущему, за исключением того, что с его помощью можно прочитать элемент массива слов, двойных слов или учетверенных слов, просто поместив номер элемента в регистр
mov ax, [esi*2]+2
Множитель, который может быть равен 1, 2, 4 или 8, соответствует размеру элемента массива – байту, слову, двойному слову, учетверенному слову соответственно. Из регистров в этом варианте адресации можно использовать только ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ЕВР, ESP, но не SI, DI, ВР или SP, которые можно было использовать в предыдущих вариантах.
Это самая полная возможная схема адресации, в которую входят все случаи, рассмотренные ранее, как частные. Смещение может быть байтом, словом или двойным словом. Если ESP или ЕВР используются в роли базового регистра, селектор сегмента операнда берется по умолчанию из регистра SS, во всех остальных случаях – из DS.
Таблица 3.2. Использование режимов адресации в архитектуре Intel Х86
|
Режим адресации |
Описание в Ассемблере |
Регистр сегмента (по умолчанию) |
Пример использования |
|
|
Код |
Название |
|||
|
0 |
Регистровая |
EAX/AX/AL |
|
MOV EAX, EDX ; DEC CX MOV AL, CH ; PUSH DS IN AL, DX |
|
1 |
Непосредственная |
Данное в виде константы (номер порта ввода-вывода) |
|
MOV AX, 1000h; ADD AL, -30h AND EAX, 0000FFFFh OUT 21h, AL |
|
2 |
Прямая |
Имя (метка) сме- щения в памяти |
DS |
MOV BL, Mem_B1 MOV AX, OFFSET Table |
|
3 |
Косвенно-регистровая |
[BX], [SI], [BP], [DI], [EAX] и др. |
DS SS DS(ES) DS |
MOV AL, [SI] MOV CX, [BP] MOV AX, ES:[BX] ADD EAX, [EDX] |
|
4 |
Базовая |
[BX] + смещение, [BP] + смещение |
DS SS |
MOV AX, CS:[BX] +4 MOV CX, PAR_TAB[BP] |
|
5 |
Индексная |
[SI] + смещение, [DI] + смещение |
DS DS(ES) |
CMP ‘A’, STR1[SI] MOV AL, BYT_TAB[DI] |
|
6 |
Базово-индексная |
BX] [SI] + смещ., BX] [DI] + смещ., [BP] [SI] + смещ., [BP] [DI] + смещ. |
DS DS SS SS |
MOV AX, ES:VALUE[BX][DI]
|
|
7 |
Индексная с масштабированием |
[ERg* m] + смещ. |
DS SS – для EBP,ESP |
MOV CX, WORD_TAB[ESI*2] |
|
8 |
Базово-индексная с масштабированием |
[ERg1] [ERg2* m] + смещение |
DS SS – для EBP,ESP |
MOV BX, [EDX][ECX*2] + 8 |
Примечания:
Базовая адресация применяется для работы со строками или записями, при этом в базовый регистр заносится начало структуры или записи, а смещение задает начало некоторого поля записи или структуры (регистр BP используется по умолчанию для доступа к параметрам процедур через кадр стека). Индексная адресация применяется для доступа к элементам однородных (обычно одномерных) массивов, смещение задает начало элемента этого массива. Базово-индексная адресация используется при работе с элементами полей записи и для работы с двумерными массивами.
Формат команды представлен в табл. 3.3.
Таблица 3.3
|
Префиксы |
Переопределе-ние сегмента |
Код операции (КОП) |
Режим адресации |
МИБ |
Смещение |
Данные |
|
0/1/2*)/3*) |
0/1 |
1/2*) |
0/1 |
0/1*) |
0/1/2/4*) |
0/1/2/4*) |
В первой строке табл. 3.3 указывается имя поля команды, во второй – длина поля в байтах. Знаком *) помечены значения длины поля, используемые, начиная с процессора i80386. Максимальная длина команды для процессора i8086 равна 6 байт.
Поле префиксов в процессоре i8086 состоит из 1 байта и может задавать префикс повторения команды, который в ассемблере обозначается как REP (повторять), REPE (повторять поравну), REPNE (повторять не поравно) или префикс LOCK – запрет доступа к шине на время выполнения команды. Более подробно префиксы поясняются в прил. 1 при описании команд строковой обработки. Начиная с процессора i80386, также добавляются однобайтовые префикс размера адреса и префикс размера операнда.
Поле переопределения сегмента используется для жесткого задания регистра сегмента, участвующего в формировании исполнительного адреса, вместо регистра, принятого по умолчанию.
Поле КОП – единственное поле, которое не может быть пустым, оно определяет код (вид) операции, которая должна быть выполнена процессором и тип обрабатываемых данных (для процессора i8086 – байт или слово). Для процессора i8086 поле является однобайтовым, а начиная с процессора i80386 – двухбайтовым.
Поле режима адресации служит для задания режима адресации, места размещения операнда: в регистре или в памяти конкретного используемого регистра.
Поле МИБ (масштаб, индекс, база) является расширением поля режима адресации, используемым начиная с процессора i80386 и задающим при формировании исполнительного адреса операнда масштабный коэффициент, индексный регистр и регистр базы.
Поле смещение содержит смещение адреса памяти при использовании прямой адресации.
Поле данные содержит значение операнда при непосредственной адресации.
Все команды процессора i8086 можно разделить на следующие группы:
команды передачи данных;
команды арифметических операций над целыми числами;
логические команды;
сдвиговые команды;
команды обработки строк;
команды передачи управления;
команды прерываний;
команды управления флагами;
команды управления состоянием процессора;
команды плавающей арифметики;
команды мультимедийных расширений (ММХ – MultiMedia eXtension);
команды потокового расширения (SSE – Streaming SIMD Extension).
Арифметическая обработка числовых данных обычно выполняется с использованием математического сопроцессора (FPU – Floating Point Unit, NPR – Numeric PRocessor), который сначала выполнялся в виде отдельной микросхемы (i8087 – i80387), а начиная с процессора i80486DX встраивается в состав основного процессора. Сопроцессор называется так потому, что может работать параллельно с процессором после инициализации. Языки высокого уровня используют его непосредственно, а ассемблер порождает ESC команды.