Operators

The Assembler supports a number of operators, which are described here. The higher the precedence, the higher the priority. Expressions may be enclosed in parentheses, and such expressions are always evaluated before combined with anything outside the parentheses. The associativity of binary operators indicates the evaluation order of chained operators, left associativity meaning they are evaluated left to right, i.e., 2 - 3 - 4 is (2 - 3) - 4, while right associativity would mean 2-3-4 is 2 - (3 - 4). Some operators are not associative, meaning chaining has no meaning.

The following operators are defined:

Symbol Description

!

Logical not

~

Bitwise Not

-

Unary Minus

*

Multiplication

/

Division

%

Modulo ( AVR Assembler 2 only)

+

Addition

-

Subtraction

<<

Shift left

>>

Shift right

<

Less than

<=

Less than or equal

>

Greater than

>=

Greater than or equal

==

Equal

!=

Not equal

&

Bitwise And

^

Bitwise Xor

|

Bitwise Or

&&

Logical And

||

Logical Or

?

Conditional operator

Logical Not

Symbol: !

Description: Unary operator, which returns 1 if the expression was zero, and returns 0 if the expression was nonzero.

Precedence: 14

Associativity: None

Example: ldi r16,!0xf0 ; Load r16 with 0x00

Bitwise Not

Symbol: ~

Description: Unary operator, which returns the input expression with all bits inverted.

Precedence: 14

Associativity: None

Example: ldi r16,~0xf0 ; Load r16 with 0x0f

Unary Minus

Symbol: -

Description: Unary operator, which returns the arithmetic negation of an expression.

Precedence: 14

Associativity: None

Example: ldi r16,-2 ; Load -2(0xfe) in r16

Multiplication

Symbol: *

Description: Binary operator, which returns the product of two expressions.

Precedence: 13

Associativity: Left

Example: ldi r30,label*2 ; Load r30 with label*2

Division

Symbol: /

Description: Binary operator, which returns the integer quotient of the left expression divided by the right expression.

Precedence: 13

Associativity: Left

Example: ldi r30,label/2 ; Load r30 with label/2

Modulo

Symbol: %

Description: Binary operator, which returns the integer remainder of the left expression divided by the right expression.

Precedence: 13

Associativity: Left

Example: ldi r30,label%2 ; Load r30 with label%2

Addition

Symbol: +

Description: Binary operator, which returns the sum of two expressions.

Precedence: 12

Associativity: Left

Example: ldi r30,c1+c2 ; Load r30 with c1+c2

Subtraction

Symbol: -

Description: Binary operator, which returns the left expression minus the right expression.

Precedence: 12

Associativity: Left

Example: ldi r17,c1-c2 ;Load r17 with c1-c2

Shift left

Symbol: <<

Description: Binary operator, which returns the left expression shifted left the number given by the right expression.

Precedence: 11

Associativity: Left

Example: ldi r17,1<<bitmask ;Load r17 with 1 shifted left bitmask times

Shift right

Symbol: >>

Description: Binary operator, which returns the left expression shifted right the number given by the right expression.

Precedence: 11

Associativity: Left

Example: ldi r17,c1>>c2 ;Load r17 with c1 shifted right c2 times

Less than

Symbol: <

Description: Binary operator, which returns 1 if the signed expression to the left is Less than the signed expression to the right, 0 otherwise.

Precedence: 10

Associativity: None

Example: ori r18,bitmask*(c1<c2)+1 ;Or r18 with an expression

Less or equal

Symbol: <=

Description: Binary operator, which returns 1 if the signed expression to the left is Less than or Equal to the signed expression to the right, 0 otherwise.

Precedence: 10

Associativity: None

Example: ori r18,bitmask*(c1<=c2)+1 ;Or r18 with an expression

Greater than

Symbol: >

Description: Binary operator, which returns 1 if the signed expression to the left is Greater than the signed expression to the right, 0 otherwise.

Precedence: 10

Associativity: None

Example: ori r18,bitmask*(c1>c2)+1 ;Or r18 with an expression

Greater or equal

Symbol: >=

Description: Binary operator, which returns 1 if the signed expression to the left is Greater than or Equal to the signed expression to the right, 0 otherwise.

Precedence: 10

Associativity: None

Example: ori r18,bitmask*(c1>=c2)+1 ;Or r18 with an expression

Equal

Symbol: ==

Description: Binary operator, which returns 1 if the signed expression to the left is Equal to the signed expression to the right, 0 otherwise.

Precedence: 9

Associativity: None

Example: andi r19,bitmask*(c1==c2)+1 ;And r19 with an expression

Not equal

Symbol: !=

Description: Binary operator, which returns 1 if the signed expression to the left is Not Equal to the signed expression to the right, 0 otherwise.

Precedence: 9

Associativity: None

Example: .SET flag=(c1!=c2) ;Set flag to 1 or 0

Bitwise And

Symbol: &

Description: Binary operator, which returns the bitwise And between two expressions.

Precedence: 8

Associativity: Left

Example: ldi r18,high(c1&c2) ;Load r18 with an expression

Bitwise Xor

Symbol: ^

Description: Binary operator, which returns the bitwise Exclusive Or between two expressions.

Precedence: 7

Associativity: Left

Example: ldi r18,low(c1^c2) ;Load r18 with an expression

Bitwise Or

Symbol: |

Description: Binary operator, which returns the bitwise Or between two expressions.

Precedence: 6

Associativity: Left

Example: ldi r18,low(c1|c2) ;Load r18 with an expression

Logical And

Symbol: &&

Description: Binary operator, which returns 1 if the expressions are both nonzero, 0 otherwise.

Precedence: 5

Associativity: Left

Example: ldi r18,low(c1&&c2) ;Load r18 with an expression

Logical Or

Symbol: ||

Description: Binary operator, which returns 1 if one or both of the expressions are nonzero, 0 otherwise.

Precedence: 4

Associativity: Left

Example: ldi r18,low(c1||c2) ;Load r18 with an expression

Conditional operator

Symbol: ? :

Syntax: condition? expression1 : expression2

Description: Ternary operator, which returns expression1 if condition is true, expression2 otherwise.

Precedence: 3

Associativity: None

Example:

ldi r18, a > b? a : b ;Load r18 with the maximum numeric value of a and b.
Note: This feature was introduced in AVRASM 2.1 and is not available in 2.0 or earlier versions.