 Таблица 2.8 Выбор сегментных регистров и относительного адреса
Тип обращения к памяти
| Сегментный регистр
| Относительный адрес*
| 1. Выборка команды
| CS
| EIP(IP)
| 2. Обращение к стеку
| SS
| ESP (SP)
| 3. Адресация операнда
| DS (CS,SS,ES,FS,GS)
| EA
| 4. Адресация элемента строки-источника
| DS (CS,SS,ES,FS,GS)
| ESI (SI)
| 5. Адресация элемента строки-приемника
| ES
| EDI (DI)
| 6. Адресация операнда с использованием в качестве базового регистра EBP (BP) или ESP (SP)
| SS (CS,DS,ES,FS,GS)
| EA
| * В скобках указаны регистры, содержащие относительный адрес при обработке 16-разрядных операндов
|
Если при формировании 32-разрядного адреса значение поля R/M = 100, то команда содержит дополнительный байт адресации SIB. В таком случае правила образования ЕА определяются табл. 2.11, где (IR*F) - масштабированный индекс; IR - содержимое индексного регистра, который задается кодом INDEX; F-масштабный коэффициент, значение которого определяется кодом SS (табл. 2.12). В качестве индексного может использоваться любой из регистров общего назначения, кроме указателя стека ESP(Ta6л. 2.13).
Разрядность обрабатываемых операндов и адресов определяется режимом работы процессора. Если программы выполняются в реальном режиме или режиме виртуального 8086, то по умолчанию используются 16-разрядные относительные адреса и операнды. При работе в защищенном режиме дескриптор сегмента исполняемой команды содержит бит D, который определяет принимаемую по умолчанию разрядность адресов и операндов: 16 при D = 0,32 при D = 1. Если команде предшествуют префиксы OS, AS, то при ее выполнении принятая по умолчанию разрядность операнда или адреса изменяется. В результате разрядность операндов и относительных адресов в защищенном режиме определяется в соответствии с табл. 2.14. Для реального режима и режима виртуального 8086 выбор разрядности определяется при значениях D = 0.
Процессор реализует ряд способов адресации операнда, набор которых обеспечивает эффективную работу с языками высокого уровня (Си, Фортран и др.).
Непосредственная адресация. В качестве операнда Imm используются один, два или четыре последних байта команды. Такой способ адресации реализуется при выполнении ряда команд пересылки (MOV, PUSH), арифметических операциях (ADD, ADC, SUB, SBB, CMP, IMUL) и логических операциях (AND, OR, XOR, TEST). Непосредственная адресация задается определенным значением кода ОРС, содержащегося в первом байте этих команд, или поля REG/OPC байта MODR/M. Разрядность используемых непосредственных данных (8,16 или 32 разряда) зависит от режима работы процессора и может изменяться соответствующим префиксом.
Таблица 2.9 Формирование 16-разрядного ЕА
Поле R/M
| Поле MOD
|
| 00
| 01
| 10
| 000
| DS:[BX+SI]
| DS:[BX+SI+d8]
| DS:[BX+SI+d16]
| 001
| DS:[BX+DI]
| DS:[BX+DI+d8]
| DS:[BX+DI+d16]
| 010
| SS:[BP+SI]
| SS:[BP+SI+d8]
| SS:[BP+SI+d16]
| 011
| SS:[BP+DI]
| SS:[BP+DI+d8]
| SS:[BP+DI+d16]
| 100
| DS:[SI]
| DS:[SI+d8]
| DS:[SI+d16]
| 101
| DS:[DI]
| DS:[DI+d8]
| DS:[DI+d16]
| 110
| DS:[d16]
| SS:[BP+d8]
| SS:[BP+d16]
| 111
| DS:[BX]
| DS:[BX+d8]
| DS:[BX+d16]
|
Таблица 2.10 Формирование 32- разрядного ЕА (байт SIB отсутствует)
Поле R/M
| Поле MOD
|
| 00
| 01
| 10
| 000
| DS:[EAX]
| DS:[EAX+d8]
| DS:[EAX+d32]
| 001
| DS:[ECX]
| DS:[ECX+d8]
| DS:[ECX+d32]
| 010
| DS:[EDX]
| DS:[EDX+d8]
| DS:[EDX+d32]
| 011
| DS:[EBX]
| DS:[EBX+d8]
| DS:[EBX+d32]
| 100
| (см. табл. 1.10)
| (см. табл. 1.10)
| (см. табл. 1.10)
| 101
| DS:[d32]
| SS:[EBP+d8]
| SS:[EBP+d32]
| 110
| DS:[ESI]
| DS:[ESI+d8]
| DS:[ESI+d32]
| 111
| DS:[EDI]
| DS:[EDI+d8]
| DS:[EDI+d32]
|
Таблица 2.11 Формирование 32- разрядного ЕА (байт SIB присутствует)
Поле
| Поле MOD
| BASE
| 00
| 01
| 10
| 000
| DS:[EAX+(IR*F)]
| DS:[EAX+(IR*F)+d8]
| DS:[EAX+(IR*F)+d32]
| 001
| DS:[ECX+(IR*F)]
| DS:[ECX+(IRT)+d8]
| DS:[ECX+(IR*F)+d32]
| 010
| DS:[EDX+(IR*F)]
| DS:[EDX+(IR*F)+d8]
| DS:[EDX+(IR*F)+d32]
| 011
| DS:[EBX+(IR*F)]
| DS:[EBX+(IR*F)+d8]
| DS:[EBX+(IR*F)+d32]
| 100
| SS:[ESP+(IR*F)]
| SS:[ESP+(IR*F)+d8]
| SS:[ESP+(IR*F)+d32]
| 101
| DS:[d32+(IR*F)]
| SS:[EBP+(IR*F)+d8]
| SS:[EBP+(IR*F)+d32]
| 110
| DS:[ESI+(IR*F)]
| DS:[ESI+(IR*F)+d8]
| DS:[ESI+(IR*F)+d32]
| 111
| DS:[EDI+(IR*F)]
| DS:[EDI+(IR*F)+d8]
| DS:[EDI+(IR*F)+d32]
|
Таблица 2.12 Кодировка значений масштабного коэффициента F
| Поле SS
| Масштабный множитель F
|
|
00
01
10
11
| 1
2
4
8
|
Регистровая адресация. Операнд выбирается из регистра, определяемого полем R/M в байте MODR/M. Код, содержащийся в этом поле, задает выбираемый регистр в соответствии с табл. 2.6. Данный способ реализуется при задании в байте MODR/M значения поля MOD = 11.
Косвенно-регистровая адресация. Относительный адрес ЕА содержится в индексном (SI, DI, ESI, EDI) или базовом (ВХ, ЕВХ) регистрах или регистрах общего назначения (ЕАХ, ЕСХ, EDX). Данный способ реализуется при значении поля MOD = 00 (см. табл. 2.9,2.10).
Прямая адресация. Относительный адрес операнда ЕА содержится в команде в виде смещения d16 или d32. Этот способ адресации реализуется при значениях полей R/M = 110 и MOD = 00, R/M = 110 (см. табл. 2.9) или R/M = 101 (см. табл. 2.10).
|