Лабораторная №2. Массивы. Условные и безусловные переходы. [4 балла]
Задания
Задача [task-1.s]. [1 балл] Напишите программу которая суммирует все элементы массива. Результат остаётся в регистре AX. Очень рекомендуется для косвенной адресации к элементам массива использовать один из регистров:SI, DI.
Задача [task-2.s]. [1,5 балла] Напишите программу, которая суммирует все нечётные числа массива. Для проверки чётности используйте деление на 2 с помощью SHR: проследите, какой флаг может взводится этой командой в случае нечётных или чётных чисел и найдите в таблице инструкцию J**, которая анализирует именно этот флаг. Картинка, где показано расположение флагов в окне t88, поможет вам понять, за какой частью окна отладчика нужно следить при выполнении SHR. Решение этой задачи удобно писать на основе решения task-2.s.
Задача [task-3.s]. [1,5 балл] Напишите программу, которая отдельно суммирует все числа массива, больше K, где K — переменная, заданная в секции данных, и отдельно суммирует числа, меньшие K. Первый и второй результаты в конце программы должны находиться в AX и BX соответственно. Указание: выполнять на основе решения task-2.s.
Дополнительное задание [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).
- 10 ноября 2022, 13:25