Поля MOD и R/M определяют один из возможных способов адресации данного:
1) в случае, когда поле MOD равно 11, задается регистровый способ адресации и поле R/M определяет регистр, в котором находится операнд (см. описание поля REG);
2) в случае, когда поле MOD равно 01 или 10, задается относительный способ адресации операнда в памяти соответственно со смещением один (DISP-LO) и два байта (DISP-LO, DISP-HI); какой из относительных способов адресации (базовый индексный или индексный) используется, а также к какому сегменту (стека или данных) будет осуществлено обращение, определяется полем R/M (см. табл. 2.1);
3) в случае, когда поле MOD равно 00, смещение (DISP) в команде отсутствует и поле R/M определяет индексный или базовый индексный способ адресации; исключением является случай, когда R/M = НО; при этом задается прямой способ адресации и эффективный адрес операнда равен двухбайтовому смещению (DISP-LO, DISP-HI), непосредственно следующему за кодом операции.
Особенностью перечисленных способов адресации данных является то, что все они неявно предполагают сегментный регистр, который будет использоваться для формирования физического адреса. Существует такое правило: если в формировании эффективного адреса участвует регистр ВР, то неявно подразумевается обращение в сегмент стека (кроме, конечно, случая, когда MOD = 00 и R/M = 110). Если регистр ВР не используется, то по умолчании подразумевается сегмент данных.
Для явного задания сегментного регистра при формировании физического адреса памяти может использоваться команда замены сегмента (префикс замены сегмента). Эта команда (см. приложение) задает для следующей за ней командой использование не сегментного регистра по умолчании, а сегментного регистра, задаваемого в самом префиксе. Если команде предшествует префикс замены сегмента, при обращении к данным в процессе ее выполнения участвует сегментный регистр SR. Для режимов адресации, представленных в табл. 2.1, регистр DS может быть заменен на CS, SS или ES; а регистр SS при участии в адресации регистра ВР — на CS, DS или ES.
Если, например, перед командой, операнд которой по умолчании располагается в сегменте данных, использован префикс замены сегмента на дополнительный сегмент данных, то обращение к операнду будет осуществляться в дополнительный сегмент по адресу ES:EA, где ЕА — эффективный адрес, определяемый режимом адресации данных.
Чтобы глубже разобраться в машинных командах микропроцессора К1810ВМ86 и кодировании различных способов адресации данных, рассмотрим команду сложения ADD. В команде сложения ADD содержимое операнда-источника прибавляется к содержимому операнда—получателя (приемника) и сумма заменяет содержимое операнда-получателя. Для мнемонического представления команды используется следующая форма:
<операция> <операнд— приемник>, <операнд—источник>
В качестве операнда—приемника и операнда—источника могут кодироваться в команде и задаваться в мнемоническом представлении следующие операнды:
REG8 — 8-битовый регистр (байт);
R8/M8 — 8-битовый регистр или ячейка памяти (байт);
DATA8 — непосредственное данное (байт);
REG16 — 16-битовый-регистр (слово);
R16/M16 — 16-битовый регистр или ячейка памяти (слово);
DATA16 — непосредственное данное (слово).
Например, для операции сложения возможны следующие варианты команд:
ADD REG8, R8/M8 — сложить 8-разрядный регистр REG8 с регистром R8 или адресуемым ячейкой памяти (байт) М8, которые определяются способом адресации, задаваемым полями MOD и REG в команде; результат поместить в исходный регистр REG8;
ADD R16/M16, DATA16 — сложить содержимое 16-разрядного регистра R16 или содержимое адресуемой ячейки памяти (слово) Ml6, определяемые способом адресации, задаваемым полями MOD и REG, с непосредственными данными DATA16 (слово); результат поместить в тот же регистр R16 или в ячейку памяти Ml6;
ADD R16/M16, DATA8 — сложить содержимое 16-разрядного регистра R16 или содержимое адресуемой ячейки памяти (слово) М16, определяемой .способом адресации, задаваемым полями MOD и REG, с непосредственными данными DATA8 (байт), расширенными со знаком до 16 бит (слово); результат поместить в тот же регистр R16 или в ячейку памяти Ml6.
В зависимости от режима адресации команда сложения ADD с непосредственным способом адресации одного из операндов может принимать одну из форм, представленных на рис. 2.10.
a) 10000000 11000110 00011111 (80 C6 IF)
(C=0, W=0, MOD=11, R/M=110, DATA-3.1)
ADD DH, 31 (ADD REGS, DATA8)
Сложить содержимое регистра DH с непосредственными данными (байт) ц результат поместить в DH (регистровый и непосредственный способы адресации).
б) 10000011 11000110 11110100 (83 С6 F4)
(C=l. W=l, MOD=11, R/M-110. DATA—12)
ADD SI, -12 (ADD REG 16, DATA8)
Сложить содержимое регистра SI с непосредственными данными (байт), расширенных со знаком до слова, и результат поместить в SI (регистровый и непосредственный способы адресации).
в) 10000001 00000110 11111111 00000001 11 ПО 100 11111110
(81 06 FF 01 F4 FE)
(С=0, W=l, MOD=00, R/M=110, DISP=511, DATA=-268)
ADD [511], -268- (ADD M16, DATA16)
Сложить содержимое регистра ячейки памяти, эффективный адрес которой равен DISP, с непосредственными данными (слово), и результат поместить в эту ячейку памяти (прямой в сегмент данных и непосредственный способы адресации).
Рис. 2.10. Формат команды сложения ADD
адресуемого операнда с непосредственными данными
