Микроконтроллеры для систем автоматики - часть 9

 

  Главная      Учебники - Производство     

 

поиск по сайту           правообладателям

 

 

 

 

 

 

 

 

 

содержание   ..  7  8  9  10   ..

 

 

Микроконтроллеры для систем автоматики - часть 9

 

 

 

35 

º 

Определяемые пользователем метки.  

Метка  может  располагаться  перед  командой/директивой  или  входить  в 

директиву. 

Если  метка  располагается  перед  командой  (или  перед  директивой) 

микроконтроллера,  то  после  неё  ставится  символ : (двоеточие).  Двоеточие 
указывает  ассемблеру,  что  метка  задает  состояние  программного  счетчика  в 
отмеченном месте программы.  

Например, 
Lab23: mov r5,r7  ; строка в программе отмечена меткой Lab23  
Если метка входит в директиву то, она рассматривается как один из операндов 

этой директивы и двоеточием не отмечается. 

Например,  
.set pina = $19  

; метка pina  с помощью директивы .set связывается с числом 

$19 

º 

Определяемые пользователем с помощью директивы set переменные. 

Директива .set связывает  метку  и  переменную.  Эта  метка  может 

использоваться  далее  в  программе  вместо  переменной.  Метка,  указывающая  на 
переменную в соответствии с директивой set, может быть впоследствии изменена. 

Например,  
.set pina = $19  

; метка pina связывается с числом $19 

.set porta = pina + 2  

; метка porta связывается с числом $19+2=$1B 

…… 
out porta,r2  

 

Пересылка  данных  из  регистра r2 в porta (по 

адресу $1B) 

º 

Определяемые пользователем с помощью директивы equ константы. 

Директива equ связывает метку с константой. Эта метка может использоваться 

далее в программе. Метка, указывающая на константу в соответствии с директивой 
set, не может быть впоследствии изменена. 

Например,  
.equ pina = $19  

 

; метка pina связывается с числом $19 

.equ porta = pina + 2  

; метка porta связывается с числом $19+2=$1B 

…… 
out porta,r2  

;  пересылка  данных  из  регистра r2 в porta (по 
;адресу $1B) 

º 

Целые константы; заданные в одном из следующих форматов: 

десятичный (decimal), например, 255; 

шестнадцатеричный  (hexadecimal)  начинается  с  символа $ или  0х, 
например, $0a  или 0x0a; 

двоичный (binary) – начинается с символов 0b, например, 0b00001010; 

восьмеричный (octal) начинается с символа 0, например, 077. 

 

36 

О

П Е Р А Т О Р Ы

 

Все  операторы  ассемблера  перечислены  в  таблице.  Порядок  выполнения 

операторов в выражении определяется приоритетом. Операторы с большим приоритетом 
выполняются в первую очередь. Кроме того, отдельные выражения могут быть заключены 
в круглые скобки. Такие выражения также вычисляются в первую очередь. 

Таблица  4.1. 

 Операторы языка Atmel AVR Assembler 

Символ

 

Описание 

Приоритет 

!

 

Logical Not

 

Логическое НЕ 

14 

~

 

Bitwise Not

 

Побитное НЕ 

14 

  -

 

Unary Minus

 

Смена знака 

14 

*

 

Multiplication

 

Умножение 

13 

/

 

Division

 

Деление 

13 

+

 

Addition

 

Сложение 

12 

-

 

Subtraction

 

Вычитание 

12 

<<

 

Shift left

 

Сдвиг влево 

11 

>>

 

Shift right

 

Сдвиг вправо 

11 

<

 

Less than

 

Меньше 

10 

<=

 

Less than or equal

 

Меньше или равно 

10 

>

 

Greater than

 

Больше 

10 

>=

 

Greater than or equal

 

Больше или равно 

10 

==

 

Equal

 

Равно 9 

!=

 

Not equal

 

Не равно 9 

&

 

Bitwise And

 

Побитное И 8 

^

 

Bitwise Xor

 

Побитное ИСКЛЮЧАЮЩЕЕ ИЛИ 7 

|

 

Bitwise Or

 

Побитное ИЛИ 6 

&&

 

Logical And

 

Логическое И 5 

||

 

Logical Or

 

Логическое ИЛИ 4 

Логическое НЕ 

Оператор | возвращает  1,  если  выражение  равно 0, в  противном  случае 

возвращает 0  

Например:  ldi r16,!$f0  ; в регистр r16 пересылается $00  

Побитное НЕ 

Оператор ~  возвращает побитную инверсию выражения. 
Например:  ldi r16,~$f0 ; в регистр r16 пересылается $0f  

 

37 

Смена знака 

Оператор - возвращает отрицание арифметического выражения 
Например: ldi r16,-2 ; пересылается число –2 ($fe) в регистр r16  

Умножение 

Оператор * возвращает произведение выражений 
Например: ldi r30,label*2 ; пересылается в регистр r30 произведение label*2  

Деление 

Оператор / возвращает целую часть от деления левой части выражения на правую. 
Наример: ldi r30,label/2 ; пересылается в регистр r30 целая часть выражения label/2 . 

Сложение 

Оператор + возвращает сумму двух выражений 
Пример:     ldi r30,c1+c2  ; пересылается в регистр r30 сумма c1+c2  

Вычитание 

Оператор - возвращает разность двух выражений. 
Например: ldi r17,c1-c2  ;пересылается в r17 разность c1-c2  

Сдвиг влево 

Оператор << возвращает  левое  выражение  сдвинутое  влево  на  количество  бит, 

указанных в правом выражении. 

Например: ldi r17,1<<bitmask ; Пересылается в регистр r17 число 1 сдвинутое влево 

на bitmask бит. 

Сдвиг вправо 

Оператор >> возвращает  выражение  в  левой  части  сдвинутое  вправо  на 

количество бит, указанных в правой части. 

Например: ldi r17,c1>>c2  ;пересылается в регистр r17 число c1 сдвинутое вправо на 

c2 бит.  

Меньше 

Оператор < возвращает 1, если выражение в левой части меньше, чем выражение 

в правой; 0 – в противном случае 

Например: ori r18,bitmask*(c1<c2)+1  ;выполняется логическое ИЛИ регистра r18 с 

результатом вычислений bitmask*(c1<c2)+1  

Меньше или равно 

Оператор <= возвращает 1, если выражение в левой части меньше или равно, чем 

выражение в правой части; 0 – в противном случае 

Например:      ori  r18,bitmask*(c1<=c2)+1 ; логическое  ИЛИ  r18  с  результатом 

вычисления выражения. 

 

38 

Больше 

Оператор    >  возвращает  1,  если  выражение  со  знаком  слева  больше,  чем 

выражение со знаком справа; 0 – в противном случае. 

Например: ori r18,bitmask*(c1>c2)+1 ; логическое ИЛИ r18 с выражением .  

Больше или равно 

Оператор >= возвращает  1,  если  выражение  в  левой  части  больше  или  равно, 

выражению в правой; 0 -  в противном случае.. 

Например: ori r18,bitmask*(c1>=c2)+1 ; логическое ИЛИ r18 с выражением. 

Равно 

Оператор == возвращает  1,  если  выражение  в  левой  части  равно,  выражению в 

правой; 0 -  в противном случае.. 

Например: andi r19,bitmask*(c1==c2)+1  

; логическое И r19 с выражением  

Не равно 

Оператор |= возвращает 1, если выражение в левой части не равно, выражению в 

правой; 0 -  в противном случае.. 

Например: .set flag=(c1|=c2)   

; установка переменной flag  

Побитное И 

Оператор & возвращается поразрядное логическое И между двумя выражениями   
Например: ldi r18,High(c1&c2)   ; пересылка в r18 выражения  

Побитное ИСКЛЮЧАЮЩЕЕ ИЛИ 

Оператор ^ возвращается  поразрядное  ИСКЛЮЧАЮЩЕЕ  ИЛИ  между  двумя 

выражениями   

Например:  ldi r18,Low(c1^c2)    ;пересылка в r18 выражения  

Побитное ИЛИ 

Оператор | возвращается поразрядное ИЛИ между двумя выражениями   
Пример: ldi r18,Low(c1|c2)  

; пересылка в r18 выражения  

Логическое И 

Оператор && возвращается  1,  если  оба  выражения  отличны  от  нуля; 0 – в 

остальных случаях  

Например:  ldi r18,Low(c1&&c2)  ; пересылка в r18 выражения  

Логическое ИЛИ 

Оператор || возвращает 1, если один или оба из выражения отличны от нуля, 0 – в 

остальных случаях. 

Например: ldi r18,Low(c1||c2)  ; пересылка в r18 выражения  

 

 

 

 

 

 

 

содержание   ..  7  8  9  10   ..