Difference between operator precedence in assembly language and C
armasm does not follow exactly the same order of precedence when evaluating operators as a C compiler.
For example, (1 + 2 :SHR: 3)
evaluates
as (1 + (2 :SHR: 3))
= 1 in assembly language.
The equivalent expression in C evaluates as ((1 + 2) >>
3)
= 0.
ARM® recommends you use brackets to make the precedence explicit.
If your code contains an expression that would parse differently in C, and
you are not using the --unsafe
option, armasm gives a warning:
A1466W: Operator precedence means that expression would evaluate differently in C
In the following tables:
- The highest precedence operators are at the top of the list.
- The highest precedence operators are evaluated first.
- Operators of equal precedence are evaluated from left to right.
The following table shows the order of precedence of operators in assembly language, and a comparison with the order in C.
Table 12-9 Operator precedence in ARM assembly language
assembly language precedence | equivalent C operators |
---|---|
unary operators | unary operators |
* / :MOD : |
* / % |
string manipulation | n/a |
:SHL: :SHR: :ROR: :ROL: |
<< >> |
+ - :AND: :OR: :EOR: |
+ - & | ^ |
= > >= < <= /= <> |
== > >= < <= != |
:LAND: :LOR: :LEOR: |
&& || |
The following table shows the order of precedence of operators in C.
Table 12-10 Operator precedence in C
precedence |
---|
unary operators |
* / % |
+ - (as binary operators) |
<< >> |
< <= > >= |
== != |
& |
^ |
| |
&& |
|| |