爱妃科技arm汇编 表达式、文本和运算符 | | 爱妃科技
正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home android 嵌入式开发 arm汇编 表达式、文本和运算符
Home android 嵌入式开发 arm汇编 表达式、文本和运算符

arm汇编 表达式、文本和运算符

android 嵌入式开发 by

一、字符串表达式

字符串表达式由字符串文本、字符串变量、字符串处理运算符和括号组成。

对于不能放在字符串文本中的字符,可使用:CHR:一元运算符将其放在字符串表达式中。允许使用从0到255的任何ASCII字符。
字符串表达式的值长度不能超过512个字符。其长度可以是零。
示例
improb  SETS    "literal":CC:(strvar2:LEFT:4)
            ; sets the variable 
improb
 to the value "literal"
            ; with the left-most four characters of the
            ; contents of string variable 
strvar2
 appended

二、字符串文本

字符串文本由包含在双引号字符内的一系列字符组成。字符串文本的长度受输入行长度的限制
要在字符串中包含双引号字符或美元字符,可使用两个该字符。
也可以使用C字符串转义序列,除非指定了—noesc选项。
示例
abc     SETS    "this string contains only one "" double quote"
def     SETS    "this string contains only one $$ dollar symbol"

三、数字表达式

数字表达式由数字常数、数字变量、普通数字文本、二元运算符和括号组成。

如果整个表达式的取值为不包含寄存器或PC的值,则数字表达式可以包含相对于寄存器或相对于程序的表达式。
数字表达式的取值为32位整数。您可以将其解释为取值范围在0到232–1之间的无符号数,或是取值范围在–231到231–1之间的有符号数。但是,汇编器不区分–n和232–n。关系运算符(如>=)使用无符号解释。这意味着0 >–1为{FALSE}。
 示例
a   SETA    256*256           ; 256*256 is a numeric expression
    MOV     r1,#(a*22)        ; (a*22) is a numeric expression

四、数字文本

数字文本可以采用下面任一种形式:

  • decimal-digits
  • 0xhexadecimal-digits
  • &hexadecimal-digits
  • n_base-n-digits
  • ‘character’

其中:

decimal-digits
是仅使用数字0到9的字符序列。
hexadecimal-digits
是仅使用数字0到9以及字母A到F或a到f的字符序列。
n_
是一个介于2到9之间(包括2和9)的数字,后跟一个下划线字符。
base-n-digits
是仅使用数字0到(n–1)的字符序列
character
是除单引号之外的任何单个字符。如果需要单引号,请使用\’。在这种情况下,数字文本的值即为该字符的数字代码。
您不能使用任何其他字符。
字符序列的取值必须是0到232–1之间(DCQ和DCQU指令除外,在这两个指令中范围是0到264–1)的整数。
a       SETA    34906
addr    DCD     0xA10E
        LDR     r4,=&1000000F
        DCD     2_11001010
c3      SETA    8_74007
        DCQ     0x0123456789abcdef
        LDR     r1,='A'             ; pseudo-instruction loading 65 into r1
        ADD     r3,r2,#'\''         ; add 39 to contents of r2, result to r3

五、浮点文本

浮点文本可以采用下面任一种形式:

  • {-}digitsE{-}digits
  • {-}{digits}.digits
  • {-}{digits}.digitsE{-}digits
  • 0xhexdigits
  • &hexdigits
  • 0f_hexdigits
  • 0d_hexdigits

其中:

 digits
是仅使用数字0到9的字符序列。E大写或小写均可。这些形式符合正常的浮点记号。
 hexdigits
是仅使用数字0到9和字母A到F或a到f的字符序列。这些形式符合计算机内部的数字表示形式。输入无穷大和NaN,或是如果您想确定您正在使用的精确位模式,则可以使用这些形式。
0x和&形式允许由任何数量的十六进制数字指定浮点位模式。
0f_形式要求只能采用8个十六进制数字的形式指定浮点位模式。
0d_形式要求只能由16个十六进制数字指定浮点位模式。
单精度浮点值的范围是:
  • 最大值 3.40282347e+38
  • 最小值 1.17549435e–38。
双精度浮点值的范围是:
  • 最大值 1.79769313486231571e+308
  • 最小值 2.22507385850720138e – 308 。
示例:
DCFD    1E308,-4E-100
    DCFS    1.0
    DCFD    3.725e15
    DCFS    0x7FC00000              ; Quiet NaN
    DCFD    &FFF0000000000000       ; Minus infinity

六、相对寄存器和程序相对的表达式

寄存器相对的表达式的取值是命名寄存器的值加上或减去一个数字常数。

程序相对地址表示为相对当前程序计数器(PC)的偏移量。它通常是标签与数字表达式的组合。
以下步骤演示程序相对地址的取值方法:
  • 当前正在执行的指令之后的指令的地址
  • 与0xFFFFFFFC按位“或”(这在ARM代码中没有作用)
  • 加上或减去数值常数

示例

LDR     r4,=data+4*n    ; n is an assembly-time variable
        ; code
        MOV     pc,lr
data    DCD     value_0
        ; n-1 DCD directives
        DCD     value_n         ; data+4*n points here
        ; more DCD directives

 

七、逻辑表达式

逻辑表达式由逻辑文本({TRUE}或{FALSE})、逻辑变量、布尔运算符、关系以及括号组合而成
关系由变量、文本、常数或表达式与适当的关系运算符组合而成

八、逻辑文本

逻辑文本是:

  • {TRUE}
  • {FALSE}

九、运算符优先级

汇编器中提供大量可在表达式中使用的运算符。其中许多运算符与C语言等高级语言中的运算符类似。
这些运算符的求值有严格的优先顺序:
  • 1、圆括号中的表达式应最先求值
  • 2、运算符根据优先顺序应用
  • 3、邻近的一元运算符从右向左求值
  • 4、优先级相同的二元运算符从左向右求值
armasm和C中的运算符优先级
汇编器的优先顺序与C语言中的顺序并不完全一致。
例如,在armasm中,(1 + 2 :SHR: 3)按(1 + (2 :SHR: 3))= 1求值。在C语言中等效的表达式按((1 + 2) >> 3)= 0求值。
建议您使用括号使优先级更加明显。
如果您的代码包含与C中的解析不同的表达式,并且没有使用–unsafe选项,则armasm通常会发出警告:
A1466W: Operator precedence means that expression would evaluate differently in C
下面显示了armasm中运算符的优先顺序,并与C中的相应顺序进行了比较:
在这些表中:
  • 优先级最高的运算符位于列表的顶端
  • 优先级最高的运算符最先求值。
  • 优先级相同的运算符从左向右求值
armasm中的运算符优先级
armasm中的优先
等效的C运算符
 一元运算符  一元运算符
* / :MOD:
 * / %
 字符串处理运算符  不适用
 :SHL: :SHR: :ROR: :ROL:  << >>
 + – :AND: :OR: :EOR:  + – & | ^
 = > >= < <= /= <>  == > >= < <= !=
 :LAND: :LOR: :LEOR:  && ||

C中的运算符优先级

C优先级
 一元运算符
 * / %
+ -(同二元运算符)
 << >>
 < <= > >=
 == !=
 &
 ^
 |
 &&
 ||

十、一元运算符

一元运算符具有最高的优先级,最先求值。一元运算符位于其操作数之前。相邻的运算符从右向左求值。
列出了返回字符串的一元运算符
 运算符  用法  说明
 :CHR:  :CHR:A  返回A的ASCII代码字符。
 :LOWERCASE:  :LOWERCASE:string  返回给定字符串,并将其中所有的大写字符转换为小写字符。
 :REVERSE_CC:  :REVERSE_CC:cond_code  返回cond_code中条件代码的取反代码,如果cond_code不包含有效的条件代码,则返回错误。
 :STR:  :STR:A
返回与数字表达式相对应的8位十六进制字符串,如果是在逻辑表达式上使用,则返回字符串”T”或”F”。
 :UPPERCASE:  :UPPERCASE:string  返回给定字符串,并将其中所有的小写字符转换为大写字符。
返回数值或逻辑值的一元运算符:
运算符  用法  说明
 ?  ?A
由定义符号A的行所生成的可执行代码的字节数。
+和 –
 +A,-A
一元加,一元减。+和–可以用在数字表达式和相对程序表达式中。
 :BASE:  :BASE:A
如果A是PC相对或寄存器相对的表达式,则:BASE:返回其寄存器组件的编号。:BASE:在宏中非常有用。
 :CC_ENCODING:  :CC_ENCODING:cond_code
返回cond_code中条件代码的数值,如果cond_code不包含有效的条件代码,则返回错误。
 :DEF:  :DEF:A
如果定义了A,则为{TRUE},否则为{FALSE}。
 :INDEX:  :INDEX:A
如果A是寄存器相对的表达式,则:INDEX:返回相对该基址寄存器的偏移量。:INDEX:
在宏中非常有用。
 :LEN:  :LEN:A
字符串A的长度。
 :LNOT:  :LNOT:A
A的逻辑补码。
 :NOT:  :NOT:A
A的按位补码(~是一个别名,例如~A)
 :RCONST:  :RCONST:Rn
寄存器编号,0-15对应于r0-r15。

十一、二元运算符

二元运算符应写在执行运算的子表达式对之间。

二元运算符比一元运算符的优先级低。二元运算符在本节中按优先顺序出现。
该优先顺序与C语言中的顺序并不一致
乘法运算符:
乘法运算符在所有二元运算符中优先级最高。它们只作用于数字表达式。
 运算符  别名  用法  说明
 *  A*B  乘法
 /  A/B  除法
 :MOD:  %  A:MOD:B
A对B求模

字符串处理运算符:

显示了字符串处理运算符。在CC中,A和B必须同为字符串。在截取运算符LEFT和RIGHT中:
  • A必须是字符串
  • B必须是数字表达式
 运算符  用法  说明
 :CC:  A:CC:B
B合并到A的末尾
 :LEFT:  A:LEFT:B
A最左边的B个字符
 :RIGHT:  A:RIGHT:B
A最右边的B个字符
移位运算符
移位运算符作用于数字表达式,将第一个操作数按第二个操作数指定的量进行移位或循环移位。
 运算符  别名  用法  说明
 :ROL: A :ROL:B
A循环左移B位
 :ROR: A:ROR:B
A向右循环移B位
 :SHL:  << A:SHL:B
A左移B位
 :SHR:  >> A:SHR:B
A右移B位
SHR是逻辑移位,不影响符号位。
加法、减法和逻辑运算符
加法和减法运算符作用于数字表达式。
逻辑运算符作用于数字表达式。运算按位执行,即独立作用于操作数的每一位来产生结果。
 运算符  别名  用法  说明
+  A+B
A和B相加
  _ A-B
A减去B
 :AND:  &  A:AND:B
A和B的按位“与”运算
 :EOR:  ^  A:EOR:B
A和B的按位“异或”运算
 :OR:  |  A:OR:B
A和B的按位“或”运算
关系运算符
这些运算符作用于两个同类型操作数,产生逻辑值。

操作数可以是:

  • 数字
  • 程序相对的
  • 寄存器相对的
  • 字符串
字符串按照ASCII顺序排序。如果字符串A是字符串B的一个前导子串,或者对于两个字符串中最左边的不同字符,字符串A中的字符要小于字符串B中的字符,则字符串A小于字符串B。
算术值是无符号的,所以0>-1的值是{FALSE}。
 运算符  别名  用法  说明
 =  ==  A=B
A等于B
 >  A>B
A大于B
 >=  A>=B
A大于或等于B
 <  A<B
A小于B
 <=  A<=B
A小于或等于B
 /=  <>、!=  A/=B
A不等于B

布尔运算符

这些运算符的优先级最低。它们对操作数执行标准的逻辑运算。
在所有三种情况下,A和B必须为取值为{TRUE}或{FALSE}的表达式。
 运算符  别名  用法  说明
 :LAND:  &&  A:LAND:B
A和B的逻辑“与”运算
 :LEOR:  A:LEOR:B
A和B的逻辑“异或”运算
 :LOR:  ||  A:LOR:B
A和B的逻辑“或”运算

 

24 2015-08

 

我要 分享

 

 

本文 作者

 

相关 文章