Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций ОКО-2015.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
5.69 Mб
Скачать

3.3 Обработка массивов на языке Assembler для мп і80х86

3.3.1. Принципы хранения массивов в памяти ПЭВМ, механизм

базово-индексной адресации данных в МП i80x86

При описании массива стандартно указывается количество и тип элементов. При этом нумерация элементов, располагающихся в памяти последовательно, по умолчанию, начинается с нуля. Объем S памяти, занимаемой массивом, определяется как:

,

где N – количество элементов массива, T – тип (размер) элемента массива.

В общем случае при прямой адресации в команде вместе с адресом может быть указан некоторый регистр (mov AX, w[BX]). Данная команда будет работать не с указанным адресом w, а с исполнительным (эффективным) адресом wисп, вычисляемым по формуле:

,

где BX – обозначает значение в регистре ВХ.

Таким образом, прежде чем выполнить такую команду, центральный процессор прибавит к указанному адресу w текущее значение регистра ВХ, получит некоторый новый адрес и именно из ячейки с этим адресом возьмет второй операнд (если в результате сложения получилась слишком большая сумма, то от нее берутся только младшие 16 битов). Регистр ВХ носит название регистра-модификатора адреса.

В МП i80x86 разрешается в командах указывать два регістра модификатора, причем один из них должен быть регистром ВХ или ВР, а другой – регистром SI или DI. Такой вид адресации называется базовым-индексным (в регистры ВХ или ВР, как правило, заносится базовый адрес некоторой области памяти, а в регистры SI или DIиндексы элементов данной области). Полный физический адрес операнда определяется как сумма содержимого следующих регистров:

DS:[BX][SI] Aфиз=DS*10h+BX+SI;

DS:[BX][DI] Aфиз=DS*10h+BX+DI;

ЕS:[BX][SI] Aфиз=ES*10h+BX+SI;

ЕS:[BX][DI] Aфиз=ES*10h+BX+DI;

SS:[BP][SI] Aфиз=SS*10h+BP+SI;

SS:[BP][DI] Aфиз=SS*10h+BP+DI.

В общем случае для массива с индекcацией элементов, начинающейся от нуля [0..N-1], адрес i- элемента Аi определяется как:

,

где В – начальный (базовый) адрес массива, T – тип (размер) элемента массива.

Причем, значение базового адреса массива заносится, как правило, в регистр ВХ, а индекс элемента – в один из индексных регистров в SI или DI. Например:

var w: array[0..9] of word; объявление массива из 10 элементов;

……………………………

mov ES, seg w загрузить в ЕS сегментный адрес массива w;

mov BX, offset w загрузить в ВХ относительный адрес массива w;

mov SI,10 загрузить в SI индекс 5-го элемента массива w;

mov AX, ES:[BX][SI] загрузить в АХ 5-й элемент массива w.

3.3.2 Команды сравнения, условного и безусловного перехода

При сравнении данных следует применять команду микропроцессора cmp op1,op2 формат которой совпадает с форматом рассмотренных в п.п. 2.1.2 логических команд. Анализ полученного результата можно проводить с использованием команд условного перехода, анализирующих флаги ZF, SF, CF, OF. Мнемокоды команд условного перехода, применяемых для сравнения беззнаковых чисел, применяемых после команды cmp, приводятся в табл. 3.4.

Таблица 3.4 – Команды условного перехода, используемые после команды сравнения СМР

Мнемокод команды

Условие для перехода по

смр ор1, ор2

Состояние флагов

для перехода

JZ; JE / JNZ; JNE

op1=op2 / op1<>op2

ZF=1 / ZF=0

JB

op1<op2

CF=1

JBE

op1<=op2

CF=1 or ZF=1

оp1>op2

CF=0 and ZF=0

JАE

оp1>=op2

CF=0

В качестве аналогов команд JE/JNE при логических операциях целесообразно применять команды JZ/JNZ (ZF=1/ZF=0). Пример: сравнить два слова А и В, если А>B, то переход на метку greater:

mov AХ, A

загрузка содержимого ячейки А в регистр АХ;

cmp AX, B

команда сравнения содержимого и B;

ja @greater

условный переход на метку greater, если A>B;

………..

пропускаемый, в случае невыполнения условия, код;

@greater:

метка указывает на выполняемые после нее команды.



Для выполнения безусловного перехода следует применять команду jmp ор, где операнд указывает на адрес перехода, в качестве которого, как правило, указывается метка.

@lbl:

метка @lbl;

………..

произвольный программный код;

jmp @lbl

безусловный переход на метку @lbl.