ARM汇编程序设计之:汇编语言文件格式
3.浮点数字量表达式
浮点数字量有以下几种形式。
·{-}digitsE{-}digits。
·{-}{digits}.digits{E{-}digits}。
·0xhexdigits。
·hexdigits。
其中,digits为十进制数,要在其后加上字母E(大写或小写)来表示其指数;hexdigits为十六进制数。
单精度浮点数的表示范围为1.17549435e−38~3.40282347e+38;双精度浮点数的表示范围为2.22507385850720138e-308~1.79769313486231571e+308。
下面的例子说明了浮点数据量的基本用法。
DCFD1E308,-4E-100
DCFS1.0
DCFD3.725e15
LDFS0x7FC00000;
LDFDFFF0000000000000;
4.逻辑表达式
逻辑表达式一般由逻辑量、逻辑运算符和括号构成,其表达式的运算结果为真或假。与逻辑表达式相关的运算符有“=”、“>”、“”、“>=”、“=”、“/=”、“>”运算符和“LAND”、“LOR”、“LNOT”及“LEOR”运算符。
5.程序或寄存器相关表达式
寄存器相关表达式的值等于指定寄存器的值加上或减去一个数字表达式。
程序相关表达式的值等于程序计数器PC的值加上或减去一个数字表达式的值。此种表达式通常由程序中的标号与一个数字表达式组成。
下面的例子说明了程序或寄存器相关表达式的基本使用方法。
LDRr4,=data+4*n ;n是汇编时取值变量
;code
MOVpc,lr
dataDCDvalue0
;n-1个DCD伪操作
DCDvaluen ;data+4*n指向此
;更多DCD伪操作
6.汇编中的操作符
(1)操作符的优先级
在汇编语言程序设计中,表达式包含一个扩展的操作符集,这些操作符和高级语言中的运算符十分接近。其运算次序遵循如下的优先级。
①优先级相同的双目运算符的运算顺序为从左到右。
②相邻的单目运算符的运算顺序为从右到左,单目运算符的优先级高于其他运算符。
③括号运算符的优先级最高。
汇编语法的操作符优先级和C语言中的不完全相同。例如在汇编中,下面的汇编语言
(1+2∶SHR∶3)相当于(1+(2∶SHR∶3)),而在C语言中,运算则变为((1+2)>>3)=0。类似于这样的操作,在使用时要特别注意。
注意 | 为了保证表达式运算结果的正确,建议使用“()”来避免异义。 |
表10.4列出了汇编操作符的优先级以及对应的C语言运算符。
表10.4 汇编操作符优先级
汇编操作符 | C语言运算符 |
单目运算 | 单目运算 |
*/:MOD: | */% |
字符串操作 | n/a |
:SHL::SHR::ROR::ROL: | >> |
+-:AND::OR::EOR: | +-$| |
=>>==/=> | ==>>==!= |
:LAND::LOR::LEOR: | || |
说明 | 表10.3是按操作符的优先级从上到下排列的。 |
C语言运算符优先级从高到低排列如下。
·单目运算
·*/%
·+-(asbinaryoperators)
·>>
·=>>=
·==!=
·
·^
·|
·
·||
(2)单目运算
最高优先级的单目运算在表达式中最先被计算。单目操作符写在操作数的前面。运算顺序为从右到左。
表10.5列出了汇编中单目运算操作符及其返回值。
表10.5 汇编中单目运算操作符及其返回值。
操作符 | 使用 | 描述 |
:CHR: | :CHR:A | 返回字母A的ASCII码 |
:LOWERCASE | :LOWERCASE:string | 将给定字符串中的所有大写字母变成小写 |
REVERSE_CC | :REVERSE_CC:cond_code | 对条件码取反 |
:STR: | :STR:A | 将一个数字量或逻辑表达式转换成串 |
:UPPERCASE: | :UPPERCASE:string | 将给定字符串中的所有小写字母变成大写 |
? | ?A | 返回定义符号A的代码行所生产代码行的字节数 |
续表
操作符 | 使用 | 描述 |
+和- | +A和-A | 单目加和单目减,操作数为数学或程序相关表达式 |
:BASE: | :BASE:A | 如果A是程序或寄存器相关表达式,:BASE:返回基址寄存器的编号 |
:CC_ENCODING: | :CC_ENCODING:cond_code | 返回条件码中的数字值 |
:DEF: | :DEF:A | 判断A是否被定义,如果被定义返回{TRUE};如果没有定义返回{FALSE} |
:INDEX: | :INDEX:A | 如果A是寄存器相关表达式,:INDEX:返回A相对于寄存器的偏移量,常用在宏操作中 |
:LEN: | :LEN:A | 字符串A的长 |
:LNOT: | :LNOT:A | 逻辑表达式A的值取反 |
:NOT: | :NOT:A ~A | A的值按位取反 |
:RCONT: | :RCONT:Rn | 返回寄存器编号,0~15对应寄存器r0~r15 |
评论