инструкция inc изменяет следующее значение в массиве

#assembly #x86-16 #emu8086

#сборка #x86-16 #emu8086

Вопрос:

Я объявляю этот массив:

 array dw 10 dup(0) 
  

Но когда я хочу увеличить значение с помощью этого:

 mov bx, 5
inc array[bx] 
  

Она изменяет следующее значение на 256, а правильное значение на 1:
Вот так

введите описание изображения здесь

Комментарии:

1. Индекс bx подсчитывает байты, а не слова. Если вы хотите увеличить 5-е слово, bx оно должно быть 10. 386 и выше имеет режим «масштабирования», в котором вы можете это сделать [array bx*2] , но 8086 этого не делает.

2. @NateEldredge: незначительное исправление: 16-разрядный размер адреса (даже в 32-разрядном режиме) по-прежнему использует ту же кодировку ModRM 8086 (без дополнительного SIB), поэтому [array bx*2] она никогда не является законной. mov ebx, 5 однако / inc word [array ebx*2] было бы. Это имеет некоторый смысл, если вы думаете о двоичном сопоставлении для 386, выполняющем существующий 16-разрядный код, и создании аппаратного декодера для обработки старых и новых кодировок modrm: возможность использовать новую кодировку со старым размером — это дополнительная комбинация, которую фактический x86 избегает необходимости обрабатывать в защищенном режиме. режим. И, конечно же, реальный режим должен быть совместим с двоичным кодом.

Ответ №1:

Ваш массив инициализирует эти 20 байт в памяти:

 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  

Инструкции

 mov bx, 5
inc array[bx] 
  

изменит массив на

 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  

потому BX что используется как смещение, измеренное в байтах от начала массива.

Опубликованный вами снимок экрана легко создается путем попытки визуализировать элементы размером с слово из массива, но с увеличением на 1 указателя, который используется в алгоритме, вместо увеличения этого указателя на 2, что было бы правильно.

 0,0                         0:
  0,0                       0:
    0,0                     0:
      0,0                   0:
        0,1               256: 
          1,0               1:
            0,0             0:
              0,0           0:
                0,0         0:
                  0,0       0:
                    0,0     0:
  

Проверьте, так ли это…