ARM指令中特殊符号意义

ARM 中经常使用的一些表明指令的符号
特殊符号   对应指令     含义  
    =           DCB              
分配一片连续的字节存储单元并用指定的数据初始化

    &           DCD             
分配一片连续的字存储单元并用指定的数据初始化
    %           SPACE       
分配一片连续的存储单元
    ^           MAP             
定义一个结构化内存表的首地址
    #           FILED          
定义一个结构化内存表的数据域 (常常和MAP使  
                    用,一个定义起始地址,一个定义长度)         
   *            EQU              
为程序中的常量、标号等定义一个等效的字符名称,
  !                                 地址更新,结果写回到Rn中,Rn不容许是 R15
   [  |  ]                          
至关于IF  ELSE  ENDIF
 
其余:
LDM中{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送以外, 还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是 用户模式下的寄存器,而不是当前模式下的寄存器。 
TST R1,# 1   // 用于测试在寄存器R1中是否设置了最低位(%表示二进制数)
n  
 $:若是在串变量前有一个$则在汇编时编译器将用该串变量的数值取代该串变量,如:
GBLS    STR1
GBLS    STR2
STR1    SETS      “pen.”
STR2    SETS      “This is a $STR1"
编译后的结果是STR2的值为This is a pen.
若是$后是数字变量(与串变量区分),在汇编时编译器将该数字变量的数值转换成十六进制的串,而后用该十六进制的串取代$后的数字变量。
若是$后是逻辑变量,在汇编时编译器将该逻辑变量替换成它的取值(T或者F)。
若是程序中须要 $ ,则用 $$ 来表示,编译器将不进行变量替换
注意:在两个竖线 “|” 之间的 $ 并不表示进行变量替换,但若是 “|” 是在双引号内,则将进行变量替换。
 
B .    //表示程序进入死循环。'.'location counter,可在源文件中指示当前地址。该符号能够被引用或赋值。
 
ARM汇编程序中的符号
在ARM汇编语言中,符号(symbols)能够表明地址(addresse)、变量(variables)和数字常量(numeric constants)。当符号表明地址时,又称为标号(lable)。当标号以数字开头时,其做用范围为当前段(当前段没有使用ROUT伪操做时),这种标号又称为局部标号(lacal lable)。符号变量包括变量、数字常量、标号和局部标号。
一、变量
在程序中,变量的值在汇编处理过程当中可能会发生改变。在ARM汇编中变量有数字变量、逻辑变量和串变量3种类型。变量的类型在程序中是不能够改变的。
数字变量的取值范围为数字常量和数字表达式所能表示的数值;逻辑变量的取值范围为{true}和{flash};串变量的取值范围为串表达式能够表达的范围。
在ARM汇编语言中,使用GBLA、GBLL及GBLS声明全局变量;使用LCLA、LCLL及LCLS声明局部变量;使用SETA、SETL及SETS为这些变量赋值。
二、数字常量
数字常量是32位的整数。在ARM汇编语言中,使用EQU来定义数字常量。数字常量一经定义就不可修改。 进行大小比较时,认为数字常量都是无符号数
三、汇编时变量的替换
若是在串变量前有一个$字符,在汇编时编译器将用改串的数值来取代该串变量。
对于数字变量来讲,若是该变量前面有一个$字符,在汇编时编译器将该数字变量的数值转换成十六进制的串,而后用该十六进制的串取代$字符后的数字变量。
对于逻辑变量来讲,若是该逻辑变量前面有一个$字符,在汇编时编译器将该逻辑变量替换成它的取值(T或者F)
若是程序中须要字符$,则用$$来表示,编译器将不进行变量替换,而是将$$看成$.
一般状况下,包含在两个竖线(|)之间的$并不表示进行变量替换。可是若是竖线(|)是在双引号内,则将进行变量替换。
使用“.”来表示变量名称的结束
四、标号
标号是表示程序中的指令或者数据地址的符号。根据标号的生成方式可分为3种:
基于PC的标号。基于PC的标号是位于目标指令前或者程序中数据定义伪操做前的标号。这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量。经常使用于表示跳转指令的目标地址,或者代码段中所嵌入的少许数据。
基于寄存器的标号。基于寄存器的标号经常使用MAP和FIELD未定义操做,也能够该用EQU伪定义。这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数据常量。经常使用于访问数据段中的数据。
绝对地址。绝对地址是一个32位数据。它能够寻址2^32 -1,即直接能够寻址整个内存空间。
五、局部标号
局部标号主要在局部范围内使用。它由两部组成:开头是一个0-99直接的数字,后面紧接一个一般表示该局部变量做用范围的符号。
局部变量的做用范围一般为当前段,也能够用伪操做ROUT来定义局部变量的做用范围。
局部变量定义的语法格式以下:
N{routname},其中,N为0~99之间的数字。routname为符号,一般为该变量做用范围的名称(用ROUT伪操做定义的)。
局部变量引用的语法格式以下:
%{F|B}{A|T}N{routname}
其中,N为局部变量的数字号。
routname 为当前做用范围的名称(用ROUT伪操做定义的)
%表示引用操做
F指示编译器只向前搜索
B指示编译器只向后搜索
A指示编译器搜索宏的全部嵌套层次
T指示编译器搜索宏的当前层次
若是F和B都没有指定,编译器先向前搜索,再向后搜索
若是A和T都没有指定,编译器搜索全部从当前层次到宏的最高层次,比当前层次低的层次再也不搜索。
若是指定了routname,编译器向前搜索最近的ROUT伪操做,若routname与该ROUT伪操做定义的名称不匹配,编译器报告错误,汇编失败。
ARM汇编语言中的表达式
表达式是由符号、数值、单目或多目操做符以及括号组成的。
一、字符串表达式
字符串表达式由字符串、字符串变量、操做符以及括号组成。字符串的最大长度为512字节,最小长度为0.下面介绍字符串表达式的组成元素。
字符串:由包含在双引号内的一系列的字符组成。字符串的长度受到ARM汇编语言语句长度的限制。当在字符串中包含美圆符号$或者引号"时,用$$表示一个$,用""表示一个"
字符串变量:用伪操做GBLS或者LCLS声明,用SETS赋值。
操做符:
(1)LEN:返回字符串的长度
:LEN:A
其中,A为字符串变量
(2)CHR:能够将0~255之间的整数做为含一个ASCII字符的字符串。当有些ASCII字符不方便放在字符串中时,可使用CHR将其放在字符串表达式中。
:CHR:A
其中,A为某一字符的ASCII值
(3)STR:将一个数字量或者逻辑表达式转换成串。对于32位的数字量而言,STR将其转换成8个十六进制数组成的串;对于逻辑表达式而言,STR将其转换成字符串T或者F
:STR:A
其中,A为数字量或者逻辑表达式
(4)LEFT:返回一个字符串最左端必定长度的子串
A:LEFT:B
其中,A为源字符串,B为数字量,表示LEFT将返回的字符个数
(5)RIGHT:返回一个字符串最右端必定长度的子串
A:RIGHT:B
其中,A为源字符串,B为数字量,表示RIGHT将返回的字符个数
(6)CC:用于链接两个字符串。
A:CC:B
其中,A为第1个源字符串。B为第2个源字符串。CC操做符将字符串B链接在字符串A的后面。
二、数字表达式
数字表达式由数字常量、数字变量、操做符和括号组成
数字变量用伪操做GBLA或者LCLA声明,用SETA赋值,它表明一个32位的数字量。
操做符:
(1)NOT:按位取反
:NOT:A
其中,A为一个32位数字量
(2)+、—、×、/及MOD算术操做符
A+B,A-B,A×B,A/B
A:MOD:B表示A除以B的余数
(3)ROL,ROR,SHL,SHR移位
A:ROL:B将整数A循环左移B位
A:SHL:B将整数A左移B位
(4)AND、OR及EOR按位逻辑操做符
A:AND:B将数字表达式A和B按位做逻辑与操做
三、基于寄存器和基于PC的表达式
基于寄存器的表达式表示了某个寄存器的值加上(或者减去)一个数字表达式
基于PC的表达式表示了PC寄存器的值加上(或减去)一个数字表达式。基于PC的表达式一般由程序中的标号与一个数字表达式组成。相关的操做符:
(1)BASE:返回基于寄存器的表达式中的寄存器编号。
:BASE:A    A为基于寄存器的表达式
(2)INDEX:返回基于寄存器的表达式相对于其基址寄存器的偏移量。
:INDEX:A   A为基于寄存器的表达式
(3)+、﹣:正负号,能够放在数字表达式或者基于PC的表达式前面。
+A(﹣A)   A为基于PC的表达式或者数字表达式
四、逻辑表达式
由逻辑量、逻辑操做符、关系操做符以及括号组成,取值范围为{FLASE}和{TRUE}
关系操做符:用于表示两个同类表达式之间的关系。关系操做符和它的两个操做数组成一个逻辑表达式,其取值为{FALSE}或{TRUE}
如A=B 表示A等于B
A/=B,A<>B表示A不等于B
逻辑操做符:进行两个逻辑表达式之间的基本逻辑操做。操做的结果为{FLASE}或{TRUE}
:LNOT:A 逻辑表达式A的值取反
A:LAND:B逻辑表达式A和B逻辑与
五、其余的一些操做符
(1)?:返回定义符号A的代码行所生成的可执行代码的字节数
?A
其中,A为一个符号
(2)DEF:判断某个符号是否已定义
:DEF:A若是符号A已经定义,上述结果为{TRUE},不然为{FLASE}(3)SB_OFFSET_19_12:SB_OFFSET_19_12:label 其中,label为一个标号返回(label-SB)的bits[19:12](4)SB_OFFSET_11_0:SB_OFFSET_11_0:label
相关文章
相关标签/搜索