Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
ЛАБОРАТОРНАЯ РАБОТА № ___
Тема лабораторной работы: написание программы на языке ассемблер для обработки одномерных массивов.
Цель работы: изучение команд передачи управления (Jmp, Jххх, Loop) на примерах программ работы с массивами.
1. Теоретические положения.
1.1. Организация циклов в программе
Цикл можно организовать с использованием команд условного перехода (Jххх, где ххх – сокращенное обозначение различных условий перехода, например JNZ – Jump if Not Zero, JGE –Jump if Greater or Equal, и т. п.
Пример:
XOR BX, BX
Label1: ADD BX, 20d
CMP BX, 443d ; сравнить (compare) 1-й операнд с вторым
JL Label1 ; переход, если «меньше» (Jump if Less)
Цикл можно также организовать с помощью команд цикла LOOP (LOOPE/LOOPNE). Команда LOOP использует регистр CX в качестве счетчика цикла, она уменьшает регистр CX на 1 и передает управление на метку, если содержимое CX не равно 0. Если вычитание 1 из регистра CX привело к его обнулению, команда LOOP не делает перехода и выполняется следующая за нею команда.
Пример:
MOV CX, LOOP_COUNT
Label2: . . . . . . ; …тело цикла
LOOP Label2
Как видно из примера, вначале программы необходимо выполнять инициализацию регистра СХ, загружая в него число повторений цикла.
Если LOOP_COUNT был равен 0, то цикл выполнится 65536 раз!
Команда LOOPE –цикл, пока [(флаг нуля = 1) И (CX не 0)]. Выход, если [(флаг нуля = 0) ИЛИ (CX = 0)]. Тем самым становится возможным двойственное завершение цикла.
Команда LOOPNE – наоборот, выход из цикла, если флаг нуля = 0 ИЛИ если в регистре CX получился 0. То есть, также возможно двойственное завершение цикла.
Имеется еще команда JCXZ – «переход, если CX = 0». Команда не проверяет ни одного флага и не влияет ни на один из них.
Эта команда может, например, применяться в начале цикла, чтобы пропустить тело цикла, если переменная счетчика (CX) равна нулю.
1.2. Организация последовательного перебора элементов одномерного массива
Для организации последовательного доступа к элементам массива необходимо использовать один из следующих методов косвенной адресации:
- базовая – в регистр ВХ загружается адрес начала массива, затем в цикле значение регистр ВХ увеличивается на 2, если элемента массива равна слову, или на 1 если – байту.
- индексная – аналогично предыдущему, только адрес начала массива загружается в один из индексных регистров (SI, DI).
- В базовая со смещением – в регистр ВХ загружается 0. При адресации к элементу в команде указываем [BX + A], где А – имя массива. Используются и такие виды записи: [A+BX ] или A [BX ]. Затем в цикле значение регистра ВХ увеличивается на 2, если длина элемента массива равна слову, или на 1 если – байту.
- индексная со смещением – аналогично предыдущему, только 0 загружается в SI либо DI. Адресация элемента выглядит как [SI +A]; возможно [A+ SI] или A [SI].
Пример приведен в таблице.
Таблица
Пример: подсчитать количество отрицательных элементов массива А(20).
Dosseg .model small .stack 100h .data A dw 7, -3, 5, 2, 4, 8, -11, 27, 6, 4, 8, -9, 5, 3, 11, 1, 12, -7, 14, 9 count db 0 .code mov ax,@data mov ds, ax mov cx,20 sub si, si L1: mov bx, [a+si] cmp bx, 0 JGE L2 inc count L2: add si,2 loop L1 mov ah, 4ch int 21h end | ;«сокращенные» директивы ;описания сегментов ;могут использоваться ;объявляем массив чисел ;объявляем переменную счетчик ;тоже сокращ. директива опис. сегмента ; устанавливаем регистр DS ; в начало сегмента данных ; заносим длину массива ; обнуляем SI ; заносим в BX значение из массива ; сравниваем с 0 ; если >=0, то переход на метку L2 ; увеличиваем счетчик ; переходим к следующему элементу ; пока не конец – на L1 ; 4Ch – функция выхода из ; программы по 21h прерыванию |
2. Порядок выполнения работы
2.1. Составить программу для обработки элементов одномерного массива согласно заданному варианту. Варианты заданий даны в приложении А. Длина элементов исходного массива задается директивой DW. Значение элементов массива выбрать для контрольного просчета самостоятельно.
2.2. Получить загрузочный модуль.
2.3. Протестировать выполнение программы в отладчике.
3. Содержание отчета
3.1. Исходные данные для выполнения работы.
3.2. Листинг программы.
3.3. Анализ результатов выполнения программы.
3.4. Выводы.
Приложение А
Варианты заданий к лабораторной работе
Вари-ант | Задание |
1. | Дан массив С[16]. В i-том элементе массива обнулить i-тый бит. Найти сумму элементов нового массива. |
2. | Дан массив С[15] заполненный 0, 1, -1 произвольным образом. Найти сумму элементов массива. Если результат >0 то инвертировать массив. |
3. | Дан массив В[52]. В отрицательных элементах обнулить старшие байты. Определить как изменится местоположение максимального элемента |
4. | Подсчитать все отрицательные элементы массива В[45]. Найти минимальный отрицательный элемент |
5. | Дан массив С[20]. Найти минимальный элемент с установленным 13 битом и максимальный элемент с установленным 3 битом. Определить разницу между полученными значениями. |
6. | Дан массив В[45]. Найти минимум среди элементов содержащих единицу в разрядах 11 и 7. |
7. | Дан массив С[37]. Найти минимум среди нечетных элементов массива, найти максимум среди четных. Четным считается элемент, содержаний четное количество единиц. |
8. | Дан массив В[45]. Поменять старшие и младшие байты элементов массива местами. Найти положение максимального элемента до и после перестановки. |
9. | Дан массив С[35]. Найти максимум в массиве и вычесть его из всех остальных элементов. |
10. | Дан массив В[2]. Заполнить его до размера 17 элементов таким образом, что бы каждый последующий элемент массива был равен сумме двух предыдущих. |
11. | Дан массив А[35]. Найти сумму старших байтов элементов массива, которые содержат 1 в 0 бите и 0 в 10 бите. |
12. | Дан массив А[16]. Первую четверть массива поменять со второй, а третью с четвертой. |
13. | Дан массив А[14]. Поменять местами 0-ой и 1-ый элементы массива, 2-ой и 3-й, и т. д. |
14. | Дан массив С[37]. Найти максимум. В массиве поменять местами младшие и старшие байты. Найти новый максимум. Сложить полученные числа. |
15. | Дан массив С[16] состоящий из 0 и 1. Составить число следующим образом – i-тый бит равен i-тому элементу массива. |
16. | Дан массив В[16]. Определить среднее арифметическое массива, не используя команду деления. |
17. | Дан массив А[56]. Найти сумму отрицательных и сумму положительных элементов массива, инвертировать суммы. |
18. | Дан массив А[32]. Найти минимальный элемент нового массива В, элементы которого получены по следующему правилу: В[i] равен числу единиц i-того элемента массива А, если А[i]<0 ; иначе В[i] равен количеству нулей А[i] |
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
1. Асемблер. Язык и программирование для IBM PC. .К: Век+, К.: НТИ, 2003.- 736 с.
2. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера. –М.: Радио и связь, 1991.- 336 с.
3. Assembler для DOS, Windows и Unix. – М.: ДМК, 1999. – 640 с.


