Лабораторная №2. Массивы. Условные и безусловные переходы [3 балла]
Задания
Задача [task-1.s][1 балл]. Напишите программу которая суммирует все элементы массива. Результат остаётся в регистре AX
. Для косвенной адресации к элементам массива следует использовать один из регистров:SI
, DI
.
Задача [task-2.s][1 балл]. Напишите программу, которая суммирует все нечётные числа массива. Для проверки чётности используйте деление на 2 с помощью SHR
: проследите, какой флаг может взводится этой командой в случае нечётных или чётных чисел и найдите в таблице инструкцию J**
, которая анализирует именно этот флаг. Картинка, где показано расположение флагов в окне t88, поможет вам понять, за какой частью окна отладчика нужно следить при выполнении SHR
. Решение этой задачи удобно писать на основе решения task-2.s
.
Задача [task-3.s][1 балл]. Напишите программу, которая отдельно суммирует все числа массива, больше K, где K — переменная, заданная в секции данных, и отдельно суммирует числа, меньшие K. Первый и второй результаты в конце программы должны находиться в AX
и BX
соответственно.
Дополнительное задание [1 балл]
Выше отмечалось, что инструкции J**
аналогичны LOOP
. Легко заметить, что с помощью инструкций J**
тоже можно организовывать циклы. На самом деле, промышленные компиляторы практически никогда не генерируют инструкцию LOOP
для организации цикла, а всегда обходятся J**
. Это связано с тем, что LOOP
занимает один регистр (CX
) и использует его строго определённым образом, что не слишком удобно для большинства задач. В таком случае этот регистр просто «потерян» для программиста (или компилятора). Замена LOOP
на J**
позволяет избежать этого и более эффективно использовать имеющиеся регистры.
Задача [task-4.s]. Напишите программу, которая вычисляет значение выражения 8 x4 – x % 3 для x = 2, 3, 4 и последовательно записывает в массив res (в секции неинициализированных данных). Указания. Не использовать LOOP
. Выбрать регистр для хранения очередного значения x и делать переход J**
к началу тела цикла пока значение этого регистра меньше или равно 4. Для умножения на 8 используйте битовый сдвиг влево SHL
: для сдвига на 2 и более (до 15) величину сдвига следует передавать в регистре CL
(нижняя половинка регистра CX
), чтобы загрузить в CL
двойку, следует использовать инструкцию MOVB
(B от byte).
- 7 сентября 2018, 10:17