#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:
Проверьте, так ли это…