Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен информатика.doc
Скачиваний:
27
Добавлен:
25.04.2019
Размер:
464.38 Кб
Скачать

33. Модификация адресов на ассемблере. Индексирование в одномерном массиве.

Идея модификации адреса заключается в возможности программного изменения адреса операнда, обрабатываемого, какой-либо командой.

Ранее указывали точные адреса для операндов из памяти:MOV CX,A

Но можно вместе с адресом указать регистр: MOV CX, A[BX]

Тогда команда будет работать не с указанным в ней адресом A, а с так называемым исполнительным адресом

Aисп = (A+[BX]) mod 216

Здесь [BX] обозначает содержимое регистра BX. Иначе говоря, прежде чем выполнить команду, процессор прибавит к адресу A, указанному в команде, текущее значение регистра BX, получит новый адрес и именно из ячейки с этим адресом возьмет второй операнд. Если в результате сложения получится слишком большая сумма, то от нее берется только последние 16 битов, на что и указывает операция mod в приведенной формуле.

Регистры-модификаторы

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

Модификация адресов потребуется, например, при работе с индексами массивов.

ИНДЕКСИРОВАНИЕ В ОДНОМЕРНОМ МАССИВЕ

Пример. Пусть имеется массив X DW 100 DUP (?) (т.е. имеется массив X[0..99] ). Требуется записать в регистр AX сумму его элементов.

Для нахождения суммы, как ясно, нужно сначала в AX записать 0, а затем в цикле выполнять операцию AX:=AX+X[i] при i от 0 до 99. Поскольку адрес элемента X[I] равен X+2*I , то команда, соответствующая данной операции должна быть следующей:

ADD AX, X+2*I

Но такая команда запрещена – вторая ее часть (адрес) меняется. Чтобы разрешить эту проблему и используется модификация адресов. В данном случае будем заносить переменное слагаемое (2*I) в регистр SI и команда перепишется в виде:

ADD AX, X[SI]

Чтобы правильно менять содержимое регистра SI, нужно сначала в SI занести 0, а затем увеличивать его значение с шагом 2. В результате наша команда будет работать с адресами X, X+2, x+4,… X+198 (напомним, что массив двумерный и общее число элементов равно 200).

Поскольку в данном случае регистр-модификатор используется для хранения индекса, то такой регистр называют индексным, а описанный способ получения адреса переменной с индексом – индексированием.

В итоге фрагмент программы нахождения суммы элементов массива X имеет вид:

MOV AX,0 ; начальное значение суммы

MOV CX,100 ; счетчик цикла

MOV SI,0 ; начальное значение (удв-го) индекса

L: ADD AX,X[SI] ; AX:=AX+X[I]

ADD SI,2 ; следующий индекс

LOOP L ; цикл 100 раз

34. Модификация по нескольким регистрам на ассемблере. Обработка двумерных массивов.

Идея модификации адреса заключается в возможности программного изменения адреса операнда, обрабатываемого, какой-либо командой.

Ранее указывали точные адреса для операндов из памяти:MOV CX,A

Но можно вместе с адресом указать регистр: MOV CX, A[BX]

Тогда команда будет работать не с указанным в ней адресом A, а с так называемым исполнительным адресом

Aисп = (A+[BX]) mod 216

Здесь [BX] обозначает содержимое регистра BX. Иначе говоря, прежде чем выполнить команду, процессор прибавит к адресу A, указанному в команде, текущее значение регистра BX, получит новый адрес и именно из ячейки с этим адресом возьмет второй операнд. Если в результате сложения получится слишком большая сумма, то от нее берется только последние 16 битов, на что и указывает операция mod в приведенной формуле.

Регистры-модификаторы

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

Модификация адресов потребуется, например, при работе с индексами массивов.

ИНДЕКСИРОВАНИЕ В ДВУМЕРНЫХ МАССИВОВ

В ПК разрешено указывать сразу два модификатора, причем один из них обязательно должен быть BX или BP, а другой – регистром SI или DI (модифицировать по парам BX и BP или SI и DI нельзя). Применим это на примере.

Пример. Пусть имеется матрица (двумерный массив) размером 10х20:

A DB 10 DUP (20 DUP(?)) (т.е A[0..9,0..19] ) Требуется записать в регистр AL количество таких строк этой матрицы, в которых начальный элемент строки встречается еще раз.

При расположении элементов матрицы в памяти по строкам (первые 20 байтов – начальная строка матрицы, следующие 20 байтов – вторая строка и т.д.) адрес элемента A[i,j] равен A+20*i+j.

Для хранения величины 20*i отведем регистр BX, а для хранения j – регистр SI. Тогда A[BX] – это начальный адрес I-й строки матрицы, а A[BX][SI] - адрес j-го элемента этой строки.

MOV AL,0 ; количество искомых строк

; внешний цикл по строкам

MOV CX,10 ; счетчик внешнего цикла

MOV BX,0 ; смещение от А до начала ; строки (20*I)‏

L: MOV AH, A[BX] ; AH – нач.элемент строки

MOV DX, CX ; запоминание CX внешнего цикла

; внутренний цикл по столбцам

MOV CX, 19 ; задание счетчика внутр. цикла

MOV SI,0 ; индекс элемента внутри строки (j)‏

L1: INC SI ; j:=j+1

CMP A[BX][SI], AH ; A[i,j] =AH ?

LOOPNE L1 ; цикл, пока A[I,j]<>AH, но не более 19 раз

JNE L2 ; AH не повторился –> L2

INC AL ; учет строки

;конец внутреннего цикла

L2: MOV CX, DX ; восстановить CX для внешнего цикла

ADD BX, 20 ; на начало следующей строки

LOOP L ; цикл 10 раз

Здесь дополнительно использован вариант команды цикла LOOPNE, которая осуществит выход из цикла не только при равенстве вышесравниваемых значений, но и при счетчике (CX) равном нулю.