Микропроцессор позволяет масштабировать индекс. Необходимость в масштабировании возникает при работе с массивами, которые имеют размер элементов, равный 2, 4 или 8 байтам.
Организовать доступ к предпоследнему байту можно следующим образом:
1) Mas[19] ; =30
2) Mas[13h] ; =C8
Mas[esi] ; =30
4) Mov esi,6*2 ; 2 байта – размер элементов
Mov ax, Mas[esi] ; ax=01C8
Пусть эта последовательность чисел трактуется как одномерный массив. Размерность каждого элемента определяется директивой dw.
В общем случае для получения адреса элемента в массиве необходимо начальный (базовый) адрес массива сложить с произведением индекса (номер элемента минус единица) этого элемента на размер элемента массива:
база + (индекс*размер элемента)
1) индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
l постоянного (базового) — указанием прямого адреса массива в виде имени идентификатора, обозначающего начало массива (смещения);
l переменного (индексного) — указанием имени индексного регистра.
К примеру:
;поместить 3-й элемент массива mas в регистр ax:
mov ax,mas[si]
2) базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
a. постоянного (необязательного компонента), в качестве которого может выступать прямой адрес массива в виде имени идентификатора (смещение), или непосредственное значение;
b. переменного (базового) — указанием имени базового регистра;
c. переменного (индексного) — указанием имени индексного регистра.
Этот вид адресации используется при обработке двухмерных массивов. Например:
Mov eax,mas[bx][si]
В качестве базового регистра может использоваться любой из восьми регистров общего назначения. В качестве индексного регистра также можно использовать любой регистр общего назначения, за исключением esp/sp.
Например:Разработать программу, в которой просматривается массив, состоящий из слов, и производится сравнение этих элементов с нулем. Выводится соответствующее сообщение.
Пример 6: Просмотр массива слов с использованием масштабирования
;prg_12_2.asm. Для DOS16.
MASM
MODEL small
STACK 256
.data ;начало сегмента данный
;тексты сообщений:
mes1 db "не равен 0!$",10,13
mes2 db "равен 0!$",10,13
mes3 db 10,13,'Элемент $'
mas dw 2,7,0,0,1,9,3,6,0,8 ;исходный массив
.code
;.486 ;это обязательно
start:
mov ax,@data
mov ds,ax ;связка ds с сегментом данных
xor ax,ax ;обнуление ax
prepare:
mov сx,10 ;значение счетчика цикла в cx
mov esi,0 ;индекс в esi
compare:
mov dx,mas[esi*2] ;первый элемент массива в dx
cmp dx,0 ;сравнение dx с 0
je equal ;переход, если равно
not_equal: ;не равно
mov ah,09h ;вывод сообщения на экран
lea dx,mes3
int 21h
mov ah,02h ;вывод номера элемента массива на экран
mov dx,si
add dl,30h
int 21h
mov ah,09h
lea dx,mes1
int 21h
inc esi ;на следующий элемент
dec сх ;условие для выхода из цикла
jcxz exit ;cx=0? Если да - на выход
jmp compare ;нет - повторить цикл
equal: ;равно 0
mov ah,09h ;вывод сообщения mes3 на экран
lea dx,mes3
int 21h
mov ah,02h
mov dx,si
add dl,30h
int 21h
mov ah,09h ; вывод сообщения mes2 на экран
lea dx,mes2
int 21h
inc esi ;на следующий элемент
dec ex ;все элементы обработаны?
jcxz exit
jmp compare
exit:
mov ax,4c00h ;стандартный выход
int 21h
end main ;конец программы
Возможны следующие случаи при адресации массивов:
1) если для описания адреса используется только один регистр, то такая адресация называется базовой адресациейи этот регистр рассматривается как базовый:
; переслать байт из области данных, адрес которой находится в
; регистре ebx
mov al,[ebx]
2) если для задания адреса в команде используется прямая адресация (в виде идентификатора) в сочетании с одним регистром, то такая адресация называется индексной адресацией. Регистр считается индексным и поэтому можно использовать масштабирование для получения адреса нужного элемента массива:
;сложить содержимое eax с двойным словом в памяти по адресу
; mas + (ebx)*4
add eax,mas[ebx*4]
3) если для описания адреса используются два регистра, то такая адресация называется базово-индексной адресацией.Левый регистр рассматривается как базовый, а правый — как индексный.
Базово-индексную адресацию можно сочетать с прямой адресацией или указанием непосредственного значения. Адрес тогда будет формироваться как сумма всех компонентов.