Встроенные системы - инструкции

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

Инструкции по петле и прыжку

Зацикливание в 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 Кбайтного диапазона.