Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
проги для экзамена.doc
Скачиваний:
12
Добавлен:
23.12.2018
Размер:
127.49 Кб
Скачать

2.9.1. Заполнить числом, содержащимся в регистре r3 область внешней памяти с начальным адресом addr1 и количеством элементов, содержащихся в r4.

Распределение ресурсов: Операция заполнения даже проще, чем пересылка, так как не надо запоминать два адреса, а только один.

NAME FILL1

Beg: mov dptr, #ADDR1 ;загрузка в регистр-указатель адреса первой ячейки

m1: movx a, @dptr ;пересылка содержимого первой ячейки в А

mov a, r3 ;заполнение этого регистра байтом из R3

movx @dptr,a ;обратная пересылка уже заполненного байта во внешнюю память

inc dptr ;увеличение адреса на 1

djnz r4, m1 ;уменьшение счетчика числа байтов на 1, проверка его на 0, и если не 0, то зацикливание

END

2.10. Простейшие арифметические операции

В МК MCS-51 присутствуют команды умножения и деления целых чисел. Однако можно и не использовать их в простейших случаях, а применять либо сложение, либо сдвиг.

2.10.1. Умножить содержимое А на 4, не используя операцию умножения МК.

Распределение ресурсов: В данном конкретном случае можно воспользоваться тем свойством, что умножение числа на величину, которая кратна степени двойки, равнозначно сдвигу числа влево на количество разрядов, которое равно этой степени.

NAME MUL1

Beg: rl a ;сдвиг числа влево, что равнозначно умножению на 2

rl a ;сдвиг числа влево, что равнозначно умножению на 2

END

2.10.2. Разделить содержимое А на 2, не используя операцию деления МК

Распределение ресурсов: Здесь, подобно задаче 2.10.1., можно воспользоваться тем свойством, что деление числа на величину, которая кратна степени двойки, равнозначно сдвигу числа вправо на количество разрядов, которое равно этой степени.

NAME MUL1

Beg: rr a ;сдвиг числа вправо, что равнозначно делению на 2

END

2.11. Суммирование массивов

При подсчете суммы массива байтовых чисел для ее хранения отводится 2 ячейки, так как теоретически максимально возможная сумма составляет не более 65535. Подсчет осуществляется в цикле, а перед ним необходимо обнулить ячейки результата.

2.11.1. Подсчитать сумму чисел в однобайтном массиве во внутренней памяти данных. Массив начинается с ячейки BEG, количество элементов указано в R5, сумма должна быть помещена в пару ячеек с адресами SUM и SUM +1.

Распределение ресурсов: Так как теоретически сумма однобайтовых чисел может превышать 255, то для хранения суммы отводится 2 ячейки.

NAME SUM10

Beg1: mov r0, #BEG ;загрузка адреса начала массива

mov r1, #SUM ;загрузка адреса ячейки суммы

mov @r1, #0 ;обнуление младшего байта суммы

inc r1 ;увеличение адреса на 1 для указания на старший байт суммы

mov @r1, #0 ;обнуление старшего байта суммы

dec r1 ;установка указателя снова на младший байт суммы

m1: mov a, @r1 ;передача младшего байта суммы в А

add a, @r0 ;суммирование числа с младшим байтом суммы

mov @r1, a ;сохранение младшего байта суммы

inc r1 ;установка указателя на старший байт суммы

mov a, @r1 ;передача старшего байта суммы в А

addc a, #0 ;суммирование со старшим байтом суммы возможного переноса

mov @r1, a ;сохранение старшего байта суммы

dec r1 ;установка указателя снова на младший байт суммы

inc r0 ;увеличение указателя на число на 1

djnz r5, m1 ;уменьшение счетчика числа байтов на 1, проверка на 0 и зацикливание, если не 0

END