Использование 80x86 Регистрация в качестве индекса массива - PullRequest
1 голос
/ 13 февраля 2011

Я пытался понять это некоторое время.В программе, с которой я работаю, например, я беру ввод с клавиатуры, используя:

MOV AH,2h;
INT 21h;

По сути, после того, как это возвращает символ из консоли, я пытаюсь передать это значение вMOV с AL в качестве индекса массива, например:

MOV dl,array[[AL]]

В моем простом примере я извлекаю значение ASCII и выплевываю следующий символ на основе сгенерированной таблицы (в основном простопроизвольное упражнение).

Я пробовал массив [AL], массив [[AL]] и, вероятно, еще дюжину других вещей.Когда я собираю свой код в MASM, я получаю эту ошибку:

**error A2031: Must be index or base register**

Разве [AL] не возвращает значение, сохраненное в регистре / указателе AL?

Как мне сделать эту работу

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

Вам необходимо использовать индекс или базовый регистр внутри [].В режиме 8086 только два базовых регистра - это BX и BP, а только два индексных регистра - это SI и DI.Поэтому вам нужно сделать что-то вроде:

mov BH,0;
mov BL,AL
mov DL,array[BX];

вместо того, чтобы пытаться использовать AL непосредственно в качестве базового регистра.Кроме того, вы можете попробовать использовать инструкцию XLAT, что примерно эквивалентно mov AL,[BX+AL]

0 голосов
/ 13 февраля 2011

Как говорит ошибка, вам нужно использовать индексный регистр, такой как SI, DI или базовый регистр BX.Если я правильно помню, для использования других регистров здесь требуется режим 386.
Кроме того, при использовании в качестве индекса, помните, что вам может потребоваться настроить размер элемента массива, если это не байты (хотя вы, вероятно, используете байтыв данном случае).

Синтаксис индекса должен быть array[...] Полагаю, прошло более 5 лет с тех пор, как я в последний раз писал что-то в сборке.

Еще одна вещь: не должно быть AH 01h?
http://spike.scu.edu.au/~barry/interrupts.html#ah01

...