8086 сборочный регистр косвенной инструкции MOV - PullRequest
0 голосов
/ 25 июня 2019

Я просто хотел спросить: почему, когда я пишу:

MOV DL, [BX] 

это работает, но когда я пишу:

MOV DL, [AX]

это не так?

1 Ответ

4 голосов
/ 25 июня 2019

В текущем Руководстве разработчика программного обеспечения Intel® 64 и IA-32 для архитектур это описано на стр. 509 из 4898:

В 16-разрядной сборке Intel невозможно использоватьAX регистр для регистров косвенной адресации.

Как вы можете видеть в руководстве, вы можете использовать следующие регистры для косвенной адресации ;для всех следующих регистров существуют режимы адресации, которые используют их самостоятельно (или в парах base + index):

BX, BP, SI, DI

Они могут быть объединены с (с дополнительными смещениями)

 [BX+SI]    [BX+SI]+disp8    [BX+SI]+disp16
 [BX+DI]    [BX+DI]+disp8    [BX+DI]+disp16
 [BP+SI]    [BP+SI]+disp8    [BP+SI]+disp16
 [BP+DI]    [BP+DI]+disp8    [BP+DI]+disp16
 [SI]          [SI]+disp8       [SI]+disp16
 [DI]          [DI]+disp8       [DI]+disp16
 disp16        [BP]+disp8       [BP]+disp16
 [BX]          [BX]+disp8       [BX]+disp16

Следовательно, ваша первая инструкция (расширенная)

MOV DL, BYTE PTR [BX] 

действительна, а ваша вторая - нет, потому что в 8086(x86_16) В ISA нет кодировки режима адресации ModRM для него в машинном коде x86.


32-битные и 64-битные режимы адресации используют разные кодировки для режимов адресации, с дополнительным SIB (байт scale + index + base), который допускает практически любую комбинацию base и index (кроме index = RSP) и с 2-битным счетчиком сдвига (масштабным коэффициентом) для индекса.См. Ссылка на содержимое ячейки памяти.(режимы адресации x86) или другие таблицы в руководстве Intel.

mov DL, [EAX] действительно даже в 16-битном режиме , но только на 386-совместимых ЦП.

...