Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OKR_SP-2_studentam.doc
Скачиваний:
5
Добавлен:
15.09.2019
Размер:
97.79 Кб
Скачать

Вопрос 2 (2 балла).

  1. Объяснить понятие массива, понятия размера и размерности массива.

Массив есть последовательность из фиксированного количества однотипных элементов. Положение элемента в массиве определяется индексами элемента. Тип элементов бывает различен, но чаще всего используются числовые массивы.

Одномерные массивы часто называются векторами:

A = a1, a2, a3, ..., aM

Двухмерные массивы называются матрицами:

⎡a1,1, a1,2, a1,3, ..., a1,M⎤

⎢a2,1, a2,2, a2,3, ..., a2,M⎢

A = ⎢. ⎢

⎢. ⎢

⎢. ⎢

⎣aN,1, aN,2, aN,3, ..., aN,M⎦

Следует различать:

1) размерность массива – количество его “координат” или индексов;

2) размер массива – его “длину” по каждой из “координат”.

Размерность массивов бывает более двух. Так, в языке APL можно работать с массивами размерностью до 255.

В языках высокого уровня для обращения к элементу массива задаются его индексы. В языке ассемблера средств работы с индексами нет – индексы могут лишь подразумеваться. Для обращения к элементу массива нужно соответственно вычислить адрес элемента относительно начала массива.

Например, для обращения к элементу с адресом (m,n) в матрице из M строк и N столбцов:

АДР = ДЛ × (N(m - 1) + (n - 1))

С массивами могут выполняться различные операции, чаще всего арифметические:

  1. с массивом и константой – сложение, вычитание, умножение, деление и пр.;

2) с массивом и массивом – аналогичные; при этом массивы должны быть соразмерными.

Реже встречаются специальные операции, например:

1) декартово произведение: каждый элемент одного массива умножается на каждый элемент другого массива;

2) сцепление массивов – при этом соразмерность массивов особенно важна.

Для выполнения операций над массивами используются циклы, позволяющие переходить от элемента к элементу по всему массиву. Для работы с векторами достаточно одного цикла. Для работы с матрицами требуется двойной цикл (один внутри другого): один цикл управляет номером строки массива, другой – номером столбца.

  1. Объяснить понятие таблицы, принципы организации таблиц в памяти.

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

Следующий пример таблицы инициализирован символьными и числовыми значениями:

MES DB 'ЯНВАРЬ ','ФЕВРАЛЬ ','МАРТ ', ... ,'ДЕКАБРЬ '

DEN DB 31,28,30,...,31

Эту же таблицу можно представить иначе:

MESDEN DB 'ЯНВАРЬ ',31

DB 'ФЕВРАЛЬ ',28

DB 'МАРТ ',31

. . .

DB 'ДЕКАБРЬ ',31

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

Замечание.

В этих таблицах длины символьных элементов выравнены до одинаковой длины засчет дополнения концевыми пробелами.

Адресация элементов таблицы выполняется так же, как для множества. Это называется прямым табличным доступом. Так можно, например, по номеру месяца узнать его название и число дней. Но такой доступ возможен, только если элементы таблицы располагаются строго регулярно.

Адрес N-го элемента (строки):

АДР = L × (N-1)

здесь L – длина элемента.

Пусть пользователь ввел номер месяца 03, и программа должна преобразовать этот номер в алфавитное значение МАРТ. Программа для такого преобразования включает определение таблицы алфавитных названий месяцев, имеющих одинаковую длину. Так как самое длинное название СЕНТЯБРЬ, таблица имеет вид:

MESDEN DB 'ЯНВАРЬ '

DB 'ФЕВРАЛЬ '

DB 'МАРТ '

. . .

Каждый элемент таблицы имеет длину 8 байт. Адреса элементов: 'ЯНВАРЬ ' =

MESDEN, 'ФЕВРАЛЬ ' = MESDEN+8, 'МАРТ ' = MESDEN+16. Для локализации

месяца 03 программа должна выполнить следующее:

1) преобразовать введенный номер месяца из ASCII 33 в двоичное 03;

2) вычесть единицу из номера месяца: 03 - 1 = 02;

3) умножить результат на длину элемента: 02 × 8 = 16

4) прибавить произведение (18) к адресу MESDEN; в результате получится адрес

требуемого названия месяца: MESDEN+16.

При такой технике работы с таблицей непосредственно вычисляется адрес нужного элемента таблицы, поэтому операции поиска не нужны. Прямая табличная адресация весьма эффективна, но возможна лишь при последовательной организации таблицы. Однако таблицы не всегда строятся таким образом.

  1. Объяснить понятия внутренней и внешней подпрограммы, особенности организации внутренних и внешних подпрограмм.

Подпрограмма (процедура) есть часть программы или отдельная несамостоятельная программа. Обычно она выполняет определенные, логически завершенные операции, которые могут многократно требоваться при работе основной (главной) программы.

Для работы с подпрограммами используются специальные команды.

Команда CALL

Выполняет вызов подпрограммы. Работает по-разному в зависимости от типа подпрограммы. Заносит в стек адрес возврата. Формат команды:

CALL имя_подпр

Команда RET

Выполняет возврат из подпрограммы в вызывающую программу. Адрес возврата выбирается из стека.

Все подпрограммы должны начинаться директивой PROC и заканчиваться директивой ENDP.

Внутренняя подпрограмма есть часть текста главной программы. Она описывается с помощью директив PROC и ENDP и завершается командой RET. Пример структуры программы с подпрограммами:

BEGIN PROC FAR ; главная программа

. . .

BEGIN ENDP

;------------------------------------

PR_1 PROC FAR ; первая вложенная подпрограмма

. . .

PR_1 ENDP

;------------------------------------

PR_2 PROC FAR ; вторая вложенная подпрограмма

. . .

PR_2 ENDP

;------------------------------------

.

.

.

END BEGIN ; конец программы

10.5. Организация внешних подпрограмм

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

Причины такой организации программ следующие:

1) компоновка программ, написанных на разных языках, – например, для объединения мощности языка высокого уровня и эффективности языка ассемблера;

2) программа в виде одного модуля может оказаться слишком большой для ассемблирования;

3) отдельные части программы могут писать разные программисты, ассемблирующие свои модули раздельно;

4) из-за большого размера выполняемого модуля может появиться необходимость перекрытия частей программы в процессе выполнения.

Межсегментные вызовы

Вызов в другой кодовый сегмент есть межсегментный (длинный) вызов. При этом сначала записывается в стек содержимое регистра CS и заносится в этот регистр адрес другого сегмента, затем записывается в стек значение регистра IP и заносится новый относительный адрес в этот регистр. Так в стеке запоминаются адрес кодового сегмента и смещение для последующего возврата из подпрограммы. Каждая часть программы организуется как хотя-бы один сегмент.

  1. объяснить понятие символьной цепочки. Описать состав команд для работы с цепочками, особенности их применения.

Часто требуется переслать или сравнить поля данных, которые превышают длиной одно слово. Например, нужно сравнить описания или имена, чтобы отсортировать их. Элементы такого формата известны как символьные цепочки (цепочки символов) и могут быть символьными и числовыми. Для их обработки язык ассемблера содержит пять специальных команд:

MOVS – переслать один байт или одно слово из одной области памяти в другую;

LODS – загрузить из памяти один байт в регистр AL или одно слово в регистр AX;

STOS – записать содержимое регистра AL или AX в память;

CMPS – сравнить содержимое двух областей памяти, размером в один байт или в одно слово;

SCAS – сравнить содержимое регистра AL или AX с содержимым памяти.

Префикс REP позволяет этим командам обрабатывать строки любой длины.

Свойства операций над цепочками

Цепочечные команды можно использовать для повторяющейся обработки байта или слова за одно выполнение. Например, можно выбрать “байтовую” команду для обработки цепочки с нечетным числом байт или “двухбайтовую” команду для обработки четного числа байт. Ниже перечислены регистры, участвующие в цепочечных командах (для однобайтовых и двухбайтовых вариантов). Пусть регистры DI и SI содержат нужные адреса:

Команда Операнды Байт Слово

MOVS DI,SI MOVSB MOVSW

LODS AL,SI или AX,SI LODSB LODSW

STOS DI,AL или DI,AX STOSB STOSW

CMPS SI,DI CMPSB CMPSW

SCAS DI,AL или DI,AX SCASB SCASW

Например, можно кодировать операнды для команды MOVS, но опустить их для MOVSB и MOVSW. Эти команды предполагают, что регистры DI и SI содержат относительные адреса, указывающие на нужные области памяти (для загрузки адреса можно использовать команду LEA). Регистр SI обычно связан с регистром сегмента данных, составляя регистровую пару DS:SI. Регистр DI всегда связан с регистром дополнительного сегмента – пара ES:DI. Поэтому команды MOVS, STOS, CMPS и SCAS требуют инициализации регистра ES (обычно адресом в регистре DS).

Чтобы цепочечные команды обрабатывали цепочки по всей длине, используется префикс повторения команды REP. Он обеспечивает повторение команды несколько раз. Префикс пишется непосредственно перед командой (например, REP MOVSB). Для использования префикса нужно занести начальное значение в регистр CX. При каждом выполнении команды с префиксом происходит уменьшение на 1 значения в регистре CX – до нуля. Так можно обрабатывать цепочки любой длины.

Признак направления определяет направление повторяющейся операции: DF = 0 – слева направо (устанавливается командой CLD); DF = 1 – справа налево (командой STD).

Пример: пересылка 20 байт из STR1 в STR2. Предполагается, что регистры DS и ES инициализированы адресом сегмента данных:

STR1 DB 20 DUP('*')

STR2 DB 20 DUP(' ')

...

CLD ; сброс признака DF

MOV CX,20 ; счетчик на 20 байт

LEA DI,STR2 ; адрес области “куда”

LEA SI,STR1 ; адрес области “откуда”

REP MOVSB ; пересылка данных

При выполнении команд CMPS и SCAS возможна установка признаков состояния – с тем чтобы операция могла прекратиться сразу после обнаружения нужного условия. Ниже приведены варианты префикса для этих целей:

REP – повторять операцию, пока CX не равно 0;

REPZ или REPE – повторять, пока признак ZF показывает “равно или ноль”; прекратить при значении признака, показывающем “не равно или не ноль” или при CX, равном 0;

REPNE или REPNZ – повторять, пока признак ZF показывает “не равно или не ноль”; прекратить при значении признака, показывающем “равно или ноль” или при CX, равном 0.

Замечания к командам

MOVS

Для области, принимающей цепочку, используется сегментный регистр ES; регистр DI содержит относительный адрес области, передающей цепочку. Для области, передающей цепочку, используется сегментный регистр DS; регистр SI содержит относительный адрес. Перед командой нужно инициализировать регистры ES и DS, также загрузить относительные адреса полей в регистры DI и SI. В зависимости от состояния признака DF команда увеличивает или уменьшает на 1 (для байта) или на 2 (для слова) содержимое регистров DI и SI.

LODS

Загружает из памяти байт в регистр AL или слово в регистр AX. Адрес памяти определяется регистрами DS:SI. В зависимости от значения признака DF происходит увеличение или уменьшение регистра SI. Поскольку команда загружает регистр, префикс повторения не нужен. Часто команда MOV вполне соответствует команде LODS, хотя MOV генерирует три байта машинного кода, а LODS – лишь один, но требует инициализации регистра SI. Можно использовать команду LODS, когда нужно продвигаться вдоль цепочки (по байту или по слову), проверяя загружаемый регистр на конкретное значение.

Остальные команды

Требуют инициализации регистров ES:DI, DS:SI или всех вместе.

Все команды

В зависимости от признака DF увеличивают либо уменьшают значения адресов: на 1 – при побайтовой обработке; на 2 – при пословной обработке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]