- •2. Типовые задачи программирования
- •2.1. Арифметические и логические операции
- •2.1.1. Сложить содержимое ячейки внутренней памяти oper1 и регистра r0, сумму поместить в ячейку внутренней памяти sum.
- •2.1.2. Сложить содержимое регистра r0 и регистра r1, сумму поместить в ячейку внутренней памяти sum.
- •2.1.3. Вычесть из содержимого ячейки First внешней памяти данных содержимое внутренней ячейки с адресом 35н, результат поместить во вторую ячейку внешней памяти Second.
- •2.2.1. Перейти к метке dest, если содержимое ячейки внутренней памяти с адресом oper1 меньше содержимого ячейки внутренней памяти с адресом oper2.
- •2.3.1.1.Переслать 5 байт из внутренней памяти данных во другую область этого же сегмента памяти данных. Начальный адрес 1-го байта - 20н, переслать надо в ячейки, начиная с адреса 40н.
- •2.3.1.2. Переписать все байты массива чисел во внешней памяти с начальным адресом addr1 и количеством элементов, содержащихся в r5 в другую область внешней памяти с начальным адресом addr2.
- •2.3.2. Пересылка из одной области памяти в другую
- •2.3.2.1. Переслать 5 байт из внешней памяти данных во внутреннюю. Начальный адрес 1-го байта - 0000н, переслать надо в область, начиная с адреса 20н.
- •2.3.2.2. Переслать 10 байт из внутренней памяти данных во внешнюю. Начальный адрес 1-го байта - 20н, переслать надо, начиная с адреса 2000н.
- •2.3.2.3. Переслать 10 байт из памяти команд во внешнюю память данных. Начальный адрес 1-го байта - метка array1:, переслать надо, начиная с адреса 2000н.
- •2.5. Операции подсчета
- •2.5.1. Подсчитать количество ненулевых элементов в байтовом массиве внутренней памяти, адрес начала которого содержится в r0, а количество элементов - в r3.
- •2.5.2. Подсчитать количество элементов, равных ff, в байтовом массиве внутренней памяти, адрес начала которого содержится в r1, а количество элементов - в r3.
- •2.5.3. Подсчитать количество элементов, равных ffff, в массиве двухбайтовых чисел внутренней памяти, адрес начала которого содержится в r0.
- •2.6. Работа с элементами таблицы
- •2.7. Битовые операции
- •2.8.1.Увеличить содержимое регистров r4, r5 (16-ти разрядное число) на 3 (с проверкой возможного переполнения младшего разряда 16-ти разрядного числа).
- •2.8.2. Сдвинуть вправо 16 - ти разрядное число на 1 разряд.
- •2.9.1. Заполнить числом, содержащимся в регистре r3 область внешней памяти с начальным адресом addr1 и количеством элементов, содержащихся в r4.
- •2.12. Нахождение максимума и минимума
2.2.1. Перейти к метке dest, если содержимое ячейки внутренней памяти с адресом oper1 меньше содержимого ячейки внутренней памяти с адресом oper2.
Распределение ресурсов: Для использования операций перехода необходимо использовать команду, которая бы формировала соответствующие флажки в результате операции. Наиболее подходящая для этого команда SUBB - вычитания второго операнда из первого, расположенного в А. Если результат отрицательный, то устанавливается флажок переноса С=1, в противном случае он очищается. Кроме того, перед оператором вычитания надо загрузить первый операнд в А. В системе команд существуют 2 операции, проверяющие состояние флажка С: JC ADR и JNC ADR. Первая осуществляет переход, когда С=1, вторая - когда С=0. Так как нам надо проверять условие С=1, то надо использовать первую команду.
NAME SUBTR
Beg: mov a,OPER1 ;пересылка содержимого ячейки памяти в А
subba,OPER2 ;вычитание из А содержимого второй ячейки памяти.
jcDEST ;переход на метку, если С=1
END
2.2.2. Перейти к метке DEST, если содержимое ячейки внутренней памяти с адресом OPER1 больше содержимого ячейки внутренней памяти с адресом OPER2.
Распределение ресурсов: Задача аналогична задаче 2.2.1, за исключением того, что теперь переход осуществляется при С=0, поэтому должна использоваться команда JNC.
NAME SUBTR1
Beg: mov a,OPER1 ;пересылка содержимого ячейки памяти в А
subba,OPER2 ;вычитание из А содержимого второй ячейки памяти.
jnc DEST ;переход на метку, если С=0
END
2.2.3. Перейти к метке DEST, если содержимое регистра R3 меньше содержимого ячейки внутренней памяти с адресом OPER2.
Распределение ресурсов: Задача почти полностью аналогична задаче 2.2.1, за исключением того, что теперь надо загружать первый операнд из регистра.
NAME SUBTR1
Beg: mov a,R3 ;пересылка содержимого ячейки памяти в А
subba,OPER2 ;вычитание из А содержимого второй ячейки памяти.
jnc DEST ;переход на метку, если С=0
END
2.2.4.Перейти к метке DEST, если А содержит положительное число.
Распределение ресурсов: Задача аналогична задаче 2.2.1, за исключением того, что теперь сравнение происходит с фиксированным числом 0.
NAME SUBTR3
Beg:
subb a,#0 ;вычитание из А нуля для проверки положительности.
jnc DEST ;переход на метку, если С=0
END
2.3. Пересылки отдельных байтов
2.3.1. Пересылка внутри отдельных пространств памяти
Данную группу команд можно подразделить на следующие подгруппы:
· команды передачи данных, использующие внутреннюю память данных;
· команды передачи данных, использующие внешнюю память данных;
· команды работы с таблицами.
В табл.2.3 показаны команды, использующие внутреннее ОЗУ и применяемые при этом режимы адресации.
Таблица 2.3.
Команды передачи данных, использующие внутреннее ОЗУ.
Мнемоника Операция Режимы адресации
Прямая Косвенная Регистровая Непосредственная
MOV A, <src> A<=<src> x x x x
MOV <dest>, A <dest><=A x x x
MOV <dest>, <src> <dest><=<src> x x x x
MOV DPTR, #data16 DPTR<=16-bit константа x
PUSH <src> INC SP:MOV"@SP",<src> x
POP <dst> MOV <dest>, "@SP": DEC SP x
XCH A, <byte> Обмен ACC и <byte> x x x
XCHD A, @Ri Обмен младш. полубайтами ACC и @Ri x
В приведенной таблице используются стандартные обозначения: <src>, (source) - иcточник, <dest>, (destination) - приемник. Команда MOV <dest>, <src> позволяет пересылать данные между ячейками внутреннего ОЗУ или SFR без использования аккумулятора. При этом работа с верхними 128 байтами внутреннего ОЗУ может осуществляться только в режиме косвенной адресации, а обращение к регистрам SFR - только в режиме прямой адресации.
Во всех микросхемах MCS-51 стек размещается непосредственно в резидентной памяти данных чипа и растет в сторону увеличения адресов. Поскольку по отношению к SP используется косвенная адресация, то стек может попасть и в область "Upper 128", но не в SFR. В тех кристаллах, где "Upper 128" отсутствует, увеличение стека за границу 128 байт приведет к потере данных.
Операция XCH A, <byte> применяется для обмена данными (exchange) между аккумулятором и адресуемым байтом. Команда XCHD A, @Ri аналогична предыдущей, но выполняется только для младших тетрад (ниблов), участвующих в обмене.
В табл.2.4 приведены команды для работы с внешней памятью данных.
Таблица 2.4.
Команды передачи данных, использующие внешнюю память данных
Мнемоника Операция Разрядность данных
MOVX A, @Ri Чтение внешней RAM @Ri 8 бит
MOVX @Ri, A Запись во внешнюю RAM @Ri 8 бит
MOVX A, @DPTR Чтение внешней RAM @DPTR 16 бит
MOVX @DPTR, A Запись во внешнюю RAM @DPTR 16 бит
Отметим, что при любом доступе к внешней памяти данных используется только косвенная адресация и обмен информацией осуществляется исключительно через аккумулятор. В случае 8-разрядных адресаций используется R0 или R1 текущего регистрового банка, а для 16-разрядных - регистр DPTR. Сигналы чтения и записи ( и ) активизируются только во время выполнения команд MOVX.