Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shamr_voprosy.docx
Скачиваний:
6
Добавлен:
26.06.2024
Размер:
161.73 Кб
Скачать

Вариант 14. В рпд с адреса 20h находится массив из 16 чисел. Элементами массива являются числа 32, 64, 96 и 128. Подсчитать и сохранить в регистрах r4 ÷ r7 количество повторений каждого элемента.

ORG 0 ; Установка начального адреса

MOV R4, #0 ; Инициализация регистра R4 для хранения количества повторений числа 32

MOV R5, #0 ; Инициализация регистра R5 для хранения количества повторений числа 64

MOV R6, #0 ; Инициализация регистра R6 для хранения количества повторений числа 96

MOV R7, #0 ; Инициализация регистра R7 для хранения количества повторений числа 128

MOV R0, #20h ; Загрузка начального адреса массива в регистр R0

MOV R1, #16 ; Загрузка количества элементов массива в регистр R1

COUNT_LOOP:

MOV A, @R0 ; Загрузка текущего элемента массива в аккумулятор A

CJNE A, #32, CHECK_64 ; Проверка, является ли текущий элемент числом 32

INC R4 ; Увеличение количества повторений числа 32

SJMP NEXT_ELEMENT ; Переход к следующему элементу

CHECK_64:

CJNE A, #64, CHECK_96 ; Проверка, является ли текущий элемент числом 64

INC R5 ; Увеличение количества повторений числа 64

SJMP NEXT_ELEMENT ; Переход к следующему элементу

CHECK_96:

CJNE A, #96, CHECK_128 ; Проверка, является ли текущий элемент числом 96

INC R6 ; Увеличение количества повторений числа 96

SJMP NEXT_ELEMENT ; Переход к следующему элементу

CHECK_128:

CJNE A, #128, NEXT_ELEMENT ; Проверка, является ли текущий элемент числом 128

INC R7 ; Увеличение количества повторений числа 128

NEXT_ELEMENT:

INC R0 ; Увеличение указателя на следующий элемент массива

DJNZ R1, COUNT_LOOP ; Повторение цикла, пока не обработаны все элементы

EXIT:

SJMP EXIT ; Бесконечный цикл для завершения программы

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

$MOD51 ORG 0

; Задаем начальные адреса для регистров

MOV DPTR, #20h ; Устанавливаем указатель данных на начало массива

MOV R0, #16 ; Устанавливаем счетчик количества элементов массива

; Обнуляем регистры, которые будут содержать количество каждого элемента

MOV R4, #0 ; Количество элементов 32

MOV R5, #0 ; Количество элементов 64

MOV R6, #0 ; Количество элементов 96

MOV R7, #0 ; Количество элементов 128

COUNT_LOOP: ; Начало цикла подсчета

MOVX A, @DPTR ; Перемещаем значение элемента массива в аккумулятор

INC DPTR ; Увеличиваем указатель данных для следующего элемента

CJNE A, #32, CHK64 ; Проверяем, равен ли элемент 32

INC R4 ; Увеличиваем счетчик для элемента 32

SJMP CONT_LOOP ; Продолжаем цикл

CHK64:

CJNE A, #64, CHK96 ; Проверяем, равен ли элемент 64

INC R5 ; Увеличиваем счетчик для элемента 64

SJMP CONT_LOOP ; Продолжаем цикл

CHK96:

CJNE A, #96, CHK128 ; Проверяем, равен ли элемент 96

INC R6 ; Увеличиваем счетчик для элемента 96

SJMP CONT_LOOP ; Продолжаем цикл

CHK128:

CJNE A, #128, UNKNOWN ; Проверяем, равен ли элемент 128

INC R7 ; Увеличиваем счетчик для элемента 128

SJMP CONT_LOOP ; Продолжаем цикл

UNKNOWN: ; Если элемент неизвестен, пропускаем его

CONT_LOOP:

DJNZ R0, COUNT_LOOP ; Уменьшаем счетчик и возвращаемся к началу цикла

; если все элементы не были проверены

END_LOOP:

SJMP END_LOOP ; Зацикливаемся для предотвращения выполнения

; других инструкций памяти программ

END

Вариант 15. В РПД по адресам 20h÷2Fh находится массив. С адреса 30h создать массив, в который входят адреса элементов первого массива, равных 128. В регистре R2 сохранить число элементов, равных 128. Прервать выполнение программы, если будет найдено 5 элементов со значением 128.

ORG 0 ; Установка начального адреса

MOV R2, #0 ; Инициализация регистра R2 для хранения количества элементов, равных 128

MOV R0, #20h ; Загрузка начального адреса первого массива в регистр R0

MOV R1, #16 ; Загрузка количества элементов первого массива в регистр R1

MOV R3, #30h ; Загрузка адреса начала второго массива в регистр R3

SEARCH_LOOP:

MOV A, @R0 ; Загрузка текущего элемента первого массива в аккумулятор A

CJNE A, #128, NEXT_ELEMENT ; Проверка, равен ли текущий элемент числу 128

INC R2 ; Увеличение количества элементов, равных 128

MOV A, R0 ; Сохранение адреса текущего элемента первого массива во второй массив

MOV R3, A

INC R3 ; Увеличение указателя на следующую ячейку второго массива

INC R2 ; Увеличение количества элементов, равных 128

CJNE R2, #5, NEXT_ELEMENT ; Проверка, достигнуто ли количество 5 элементов со значением 128

SJMP EXIT ; Прерывание программы, если найдено 5 элементов со значением 128

NEXT_ELEMENT:

INC R0 ; Увеличение указателя на следующий элемент первого массива

DJNZ R1, SEARCH_LOOP ; Повторение цикла, пока не обработаны все элементы первого массива

EXIT:

SJMP EXIT ; Бесконечный цикл для завершения программы

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

$MOD51 ORG 0

; Инициализация регистров

MOV R0, #20h ; Начальный адрес первого массива

MOV R1, #30h ; Начальный адрес второго массива для хранения адресов

MOV R2, #0 ; Счетчик элементов, равных 128

FIND_LOOP:

MOV A, @R0 ; Загружаем значение текущего элемента первого массива

INC R0 ; Переходим к следующему адресу в первом массиве

CJNE A, #128, CHECK ; Проверяем, равно ли значение элемента 128

; Если значение равно 128, сохраняем его адрес

MOV @R1, R0 ; Сохраняем адрес предыдущего элемента во второй массив

INC R1 ; Переходим к следующему адресу во втором массиве

INC R2 ; Увеличиваем счетчик найденных элементов, равных 128

; Проверка на достижение пяти найденных элементов

CJNE R2, #05, CONTINUE

SJMP END_PROGRAM ; Прерывание выполнения программы

CHECK:

; Проверка на окончание первого массива

CJNE R0, #2Fh, FIND_LOOP

CONTINUE:

; Еще не достигнут конец массива и не найдено 5 элементов

CJNE R0, #2Fh, FIND_LOOP

; Если достигнут конец массива, завершаем программу

SJMP END_PROGRAM

END_PROGRAM:

; Инструкция зацикливания для завершения программы

SJMP END_PROGRAM

END

Вариант 16. В РПД с адресов 20h и 30h находятся 2 массива, состоящие из 16 элементов каждый. Подсчитать количество элементов первого массива, которые имеют равные значения во 2 массиве. Результат занести в регистр R2.

ORG 0 ; Установка начального адреса

MOV R2, #0 ; Инициализация регистра R2 для хранения количества совпадающих элементов

MOV R0, #20h ; Загрузка начального адреса первого массива в регистр R0

MOV R1, #30h ; Загрузка начального адреса второго массива в регистр R1

MOV R3, #16 ; Загрузка количества элементов массивов в регистр R3

COUNT_LOOP:

MOV A, @R0 ; Загрузка текущего элемента первого массива в аккумулятор A

MOV B, @R1 ; Загрузка текущего элемента второго массива в регистр B

CJNE A, B, NEXT_ELEMENT ; Проверка, равны ли текущие элементы двух массивов

INC R2 ; Увеличение количества совпадающих элементов

NEXT_ELEMENT:

INC R0 ; Увеличение указателя на следующий элемент первого массива

INC R1 ; Увеличение указателя на следующий элемент второго массива

DJNZ R3, COUNT_LOOP ; Повторение цикла, пока не обработаны все элементы массивов

EXIT:

SJMP EXIT ; Бесконечный цикл для завершения программы

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

Вариант 17. Для функции Y=40Х+10 получить первое значение, превышающее 512, начиная с Х=1. Значение аргумента записать в R4, функции - в R5, R6.

ORG 0 ; Установка начального адреса

MOV R4, #1 ; Инициализация регистра R4 с начальным значением аргумента

MOV R5, #0 ; Инициализация регистра R5 для хранения значения функции

MOV R6, #0 ; Инициализация регистра R6 для флага достижения значения 512

CALC_LOOP:

MOV A, R4 ; Загрузка текущего значения аргумента в аккумулятор A

MOV B, A ; Сохранение значения аргумента в регистр B для расчета значения функции

; Расчет значения функции Y=40X+10

MOV B, #40

MUL AB ; Результат будет храниться в регистрах B (старший байт) и A (младший байт)

ADD A, #10 ; Добавление константы 10 к результату

; Проверка, превышает ли значение функции 512

MOV R7, #0

SUBB A, R7 ; Сравнение с нулем

JC VALUE_EXCEEDS_512 ; Переход, если значение функции превышает 512

INC R4 ; Увеличение значения аргумента

SJMP CALC_LOOP ; Повторение цикла для следующего значения аргумента

VALUE_EXCEEDS_512:

MOV R5, A ; Сохранение значения функции в регистре R5

MOV R6, #1 ; Установка флага достижения значения 512 в регистре R6

EXIT:

SJMP EXIT ; Бесконечный цикл для завершения программы

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