Увеличить содержимое регистров 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
Сдвинуть вправо 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
Заполнить числом, содержащимся в регистре 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
Простейшие арифметические операции
В МК MCS-51 присутствуют команды умножения и деления целых чисел. Однако можно и не использовать их в простейших случаях, а применять либо сложение, либо сдвиг.
Умножить содержимое А на 4, не используя операцию умножения МК.
Распределение ресурсов: В данном конкретном случае можно воспользоваться тем свойством, что умножение числа на величину, которая кратна степени двойки, равнозначно сдвигу числа влево на количество разрядов, которое равно этой степени.
NAME MUL1
Beg: rl a ;сдвиг числа влево, что равнозначно умножению на 2
|
|
rl a ;сдвиг числа влево, что равнозначно умножению на 2
END
Разделить содержимое А на 2, не используя операцию деления МК
Распределение ресурсов: Здесь, подобно задаче 2.10.1., можно воспользоваться тем свойством, что деление числа на величину, которая кратна степени двойки, равнозначно сдвигу числа вправо на количество разрядов, которое равно этой степени.
NAME MUL1
Beg: rr a ;сдвиг числа вправо, что равнозначно делению на 2
END
Суммирование массивов
При подсчете суммы массива байтовых чисел для ее хранения отводится 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
Дата добавления: 2020-04-25; просмотров: 104; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!