Использование регистра 80x86 в качестве индекса массива

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

MOV AH,2h;
INT 21h;

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

MOV dl,array[[AL]]

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

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

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

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

Как мне заставить это работать?


person ultramiraculous    schedule 13.02.2011    source источник


Ответы (2)


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

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

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

person Chris Dodd    schedule 13.02.2011
comment
Хорошо, круто, спасибо. Это сработало. Не знал об инструкции XLAT, это круто. - person ultramiraculous; 14.02.2011

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

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

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

person Arc    schedule 13.02.2011
comment
Я использовал 8, потому что это не эхо. Я предполагаю, что идея состоит в том, чтобы напечатать одно, получить другое. - person ultramiraculous; 14.02.2011