Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
progi_dlya_ekzamena.doc
Скачиваний:
3
Добавлен:
25.09.2019
Размер:
120.83 Кб
Скачать

2.7.6. Перейти к метке dest, если разряд 5 порта p2 равен 0.

NAME MASK5

Beg: jnb p2.5, DEST

END

2.8. Работа с операндами увеличенной длины

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

2.8.1.Увеличить содержимое регистров r4, r5 (16-ти разрядное число) на 3 (с проверкой возможного переполнения младшего разряда 16-ти разрядного числа).

Распределение ресурсов: Для операции увеличения 16-разрядного числа на не очень большую цифру можно использовать операцию инкремента регистра DPTR. При этом не надо проверять перенос из младшего байта в старший, так для DPTR он происходит автоматически.

NAME INCR1

Beg: mov dph,r4 ;пересылка содержимого старшего байта числа в старший регистр DPTR

mov dpl,r5 ;пересылка содержимого младшего байта числа в младший регистр DPTR

inc dptr ;увеличение числа на 3

inc dptr ;

inc dptr ;

mov r4,dph ;обратная пересылка полученного числа в R4, R5

mov r5,dpl ;

END

2.8.2. Сдвинуть вправо 16 - ти разрядное число на 1 разряд.

Распределение ресурсов: В отличие от задачи 2.8.1. здесь придется использовать в качестве промежуточного регистра аккумулятор, так как операция сдвига осуществляется только для этого регистра. При этом необходимо проверять наличие переноса из младшего байта в старший. Пусть число располагается в регистрах R3 (старший байт), R4 (младший байт).

NAME SHIFT1

Beg: clr c ;очистка бита переноса перед операцией сдвига

mov a,r4 ;пересылка младшего байта в АСС

rrc a ;сдвиг вправо с учетом бита переноса, возможный перенос при сдвиге помещается во флажок С

mov r4,a ;обратная пересылка уже сдвинутого младшего байта

mov a,r3 ;пересылка старшего байта в АСС

rrc a ;сдвиг вправо с учетом бита переноса

mov r3,a ;обратная пересылка уже сдвинутого старшего байта

END

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]