Встроенные системы - инструкции
Поток программы продолжается последовательно, от одной инструкции к следующей, если не выполняется инструкция передачи управления. Различные типы команд передачи управления на ассемблере включают условные или безусловные переходы и инструкции вызова.
Инструкции по петле и прыжку
Зацикливание в 8051
Повторение последовательности инструкций определенное количество раз называется loop. ИнструкцияDJNZ reg, labelиспользуется для выполнения операции цикла. В этой инструкции регистр уменьшается на 1; если он не равен нулю, то 8051 переходит к целевому адресу, на который указывает метка.
В регистр загружается счетчик количества повторений до начала цикла. В этой инструкции и регистры уменьшения, и решение о переходе объединены в одну инструкцию. Регистры могут быть любыми из R0 – R7. Счетчик также может быть местом в ОЗУ.
пример
Multiply 25 by 10 using the technique of repeated addition.
Solution- Умножение может быть достигнуто путем повторного сложения множимого столько же раз, сколько множитель. Например,
25 * 10 = 250 (FAH)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC
MOV R2,#10 ; the multiplier is replaced in R2
Add A,#25 ;add the multiplicand to the ACC
AGAIN:DJNZ R2,
AGAIN:repeat until R2 = 0 (10 times)
MOV R5 , A ;save A in R5 ;R5 (FAH)
Drawback in 8051 - Циклическое действие с инструкцией DJNZ Reg labelограничен 256 итерациями. Если условный переход не выполняется, выполняется инструкция, следующая за переходом.
Зацикливание внутри цикла
Когда мы используем цикл внутри другого цикла, он называется nested loop. Два регистра используются для хранения счетчика, когда максимальное число ограничено 256. Таким образом, мы используем этот метод, чтобы повторить действие больше 256 раз.
Example
Напишите программу на -
- Загрузите аккумулятор со значением 55H.
- Дополните АКК 700 раз.
Solution- Так как 700 больше 255 (максимальная емкость любого регистра), два регистра используются для хранения счетчика. В следующем коде показано, как использовать два регистра R2 и R3 для подсчета.
MOV A,#55H ;A = 55H
NEXT: MOV R3,#10 ;R3 the outer loop counter
AGAIN:MOV R2,#70 ;R2 the inner loop counter
CPL A ;complement
Другие условные прыжки
В следующей таблице перечислены условные переходы, используемые в 8051 -
Инструкция | Действие |
---|---|
JZ | Перейти, если A = 0 |
JNZ | Перейти, если A ≠ 0 |
DJNZ | Уменьшение и переход, если регистр ≠ 0 |
CJNE A, данные | Перейти, если A ≠ данные |
CJNE reg, # данные | Перейти, если байт ≠ данные |
JC | Перейти, если CY = 1 |
JNC | Перейти, если CY ≠ 1 |
JB | Перейти, если бит = 1 |
JNB | Перейти, если бит = 0 |
JBC | Перейти, если бит = 1, и сбросить бит |
JZ (jump if A = 0)- В этой инструкции проверяется содержимое аккумулятора. Если он равен нулю, то 8051 переходит к целевому адресу. Инструкция JZ может использоваться только для аккумулятора, она не применяется ни к какому другому регистру.
JNZ (jump if A is not equal to 0)- В этой инструкции проверяется, что содержимое аккумулятора не равно нулю. Если он не равен нулю, то 8051 переходит к целевому адресу.
JNC (Jump if no carry, jumps if CY = 0)- Бит флага переноса в регистре флага (или PSW) используется для принятия решения, переходить или нет "метку JNC". ЦП смотрит на флаг переноса, чтобы увидеть, поднят ли он (CY = 1). Если он не поднят, то ЦП начинает выборку и выполнение инструкций с адреса метки. Если CY = 1, он не будет прыгать, но выполнит следующую инструкцию ниже JNC.
JC (Jump if carry, jumps if CY = 1) - Если CY = 1, выполняется переход к целевому адресу.
JB (jump if bit is high)
JNB (jump if bit is low)
Note - Следует отметить, что все условные переходы являются короткими переходами, т. Е. Адрес цели должен находиться в пределах от –128 до +127 байт от содержимого программного счетчика.
Безусловные инструкции по прыжкам
В 8051 есть два безусловных скачка -
LJMP (long jump)- LJMP - это 3-байтовая инструкция, в которой первый байт представляет код операции, а второй и третий байты представляют 16-битный адрес целевого местоположения. 2-байтовый целевой адрес позволяет перейти в любую ячейку памяти от 0000 до FFFFH.
SJMP (short jump)- Это 2-байтовая инструкция, где первый байт - это код операции, а второй - относительный адрес целевого местоположения. Относительный адрес находится в диапазоне от 00H до FFH, который разделен на переходы вперед и назад; то есть в пределах от –128 до +127 байт памяти относительно адреса текущего ПК (счетчик программ). В случае прямого перехода целевой адрес может находиться в пределах 127 байтов от текущего ПК. В случае обратного перехода целевой адрес может находиться в пределах –128 байт от текущего ПК.
Вычисление адреса короткого перехода
Все условные переходы (JNC, JZ и DJNZ) являются короткими переходами, потому что они представляют собой 2-байтовые инструкции. В этих инструкциях первый байт представляет код операции, а второй байт представляет относительный адрес. Целевой адрес всегда относительно значения программного счетчика. Для вычисления целевого адреса второй байт добавляется к ПК инструкции непосредственно под переходом. Взгляните на программу, приведенную ниже -
Line PC Op-code Mnemonic Operand
1 0000 ORG 0000
2 0000 7800 MOV R0,#003
3 0002 7455 MOV A,#55H0
4 0004 6003 JZ NEXT
5 0006 08 INC R0
6 0007 04 AGAIN: INC A
7 0008 04 INC A
8 0009 2477 NEXT: ADD A, #77h
9 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0, A
12 000F F9 MOV R1, A
13 0010 FA MOV R2, A
14 0011 FB MOV R3, A
15 0012 2B OVER: ADD A, R3
16 0013 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 0017 END
Расчет целевого адреса обратного перехода
В случае перехода вперед, величина смещения - положительное число от 0 до 127 (от 00 до 7F в шестнадцатеричном формате). Однако для обратного прыжка смещение имеет отрицательное значение от 0 до –128.
ЗВОНИТЕ Инструкции
CALL используется для вызова подпрограммы или метода. Подпрограммы используются для выполнения операций или задач, которые необходимо выполнять часто. Это делает программу более структурированной и экономит место в памяти. Есть две инструкции - LCALL и ACALL.
LCALL (длинный звонок)
LCALL - это 3-байтовая инструкция, в которой первый байт представляет код операции, а второй и третий байты используются для предоставления адреса целевой подпрограммы. LCALL может использоваться для вызова подпрограмм, которые доступны в адресном пространстве 64 Кбайт 8051.
Для успешного возврата к точке после выполнения вызванной подпрограммы ЦП сохраняет адрес инструкции непосредственно под LCALL в стеке. Таким образом, когда вызывается подпрограмма, управление передается этой подпрограмме, и процессор сохраняет ПК (счетчик программ) в стеке и начинает получать инструкции из нового места. Инструкция RET (возврат) передает управление обратно вызывающей стороне после завершения выполнения подпрограммы. Каждая подпрограмма использует RET в качестве последней инструкции.
ACALL (Абсолютный вызов)
ACALL - это 2-байтовая инструкция, в отличие от LCALL, которая состоит из 3 байтов. Целевой адрес подпрограммы должен находиться в пределах 2 Кбайт, потому что для адреса используются только 11 бит из 2 байтов. Разница между ACALL и LCALL заключается в том, что целевой адрес для LCALL может находиться где угодно в пределах 64 Кбайт адресного пространства 8051, в то время как целевой адрес CALL находится в пределах 2 Кбайтного диапазона.