ARM汇编特殊符号 汇编符号引用

来源:互联网 发布:c gui编程 编辑:程序博客网 时间:2024/04/30 14:13

 

特殊符号 ---- 对应指令 ---- 含义 ---- 示例
^ ---- MAP ---- 定义结构化内存表 ---- MAP 4096;内存表首地址为4096
# ---- FIELD ---- 定义内存表中的数据,结合MAP指令使用 ---- 
MAP 4096
STACKSVC FIELD     256;定义从4096开始的256字节为SVC的堆栈空间。
% ---- SPACE ---- 分配一块内存,并用“0”初始化 ---- DataStruc SPACE 280;分配280字节内存并初始化
[|]  ---- IF ELSE ENDIF ---- 条件编译,有选择的确定需要编译的代码IF,ELSE,ENDIF,可以嵌套使用 ---- 
IF 逻辑表达式
指令或伪指令
ELSE
指令或伪指令
ENDIF
另外还有符号: $
如果在串变量前有一个$,则在汇编时编译器将用该串变量的数值取代该串变量,如:
GBLS    STR1
GBLS    STR2
STR1    SETS      “pen.”
STR2    SETS      “This is a $STR1"
编译后的结果是STR2的值为This is a pen.
如果$后是数字变量(与串变量区分),在汇编时编译器将该数字变量的数值转换成十六进制的串,然后用该十六进制的串取代$后的数字变量
如果$后是逻辑变量,在汇编时编译器将该逻辑变量替换成它的取值(T或者F)
如果程序中需要$,则用$$来表示,编译器将不进行变量替换
                     GBLS   STR1
                     GBLS   B
                     GBLA   NUM1
NUM1            SETA   14
B                   SETS   “CHANGED”
STR1             SETS    “abc$$B$NUM1”
编译结果STR1的值为:abcB0000000E。
注意:在两个竖线“|”之间的$并不表示进行变量替换,但如果“|”是在双引号内,则将进行变量替换。
使用点"."来表示变量名的结束
            GBLS    STR1
            GBLS    STR2
STR1    SETS      “AAA”
STR2    SETS      “bbb$STR1.CCC"
编译结果STR2值为bbbAAACCC
还有一个例外:“%”
“%”除了表示SPACE外,还可以在局部标号中使用,具体意思见伪指令ROUT的使用示例:
◆ROUT
ROUT伪指令定义局部标号的有效范围,伪指令格式如下:{name} ROUT。其中 name 所定义的作用范围的名称。
当没有使用ROUT伪指令时,局部标号的作用范围为所在段;ROUT伪令的作用范围在本ROUT伪指令和下一个ROUT伪指令之间(指同一段中的ROUT伪指令)
伪指令应用举例如下:
    routineA ROUT                         ;定义局部标号的有效范围,名称为routineA
                  ......
    3routineA                                ;routineA范围内的局部标号3
                ......
                 BEQ   %4routineA       ;若条件成立,跳转到routineA范围内的局部标号 4
                 ......
                 BEQ   %3routineA       ;若条件成立,跳转到routineA范Iq内的局部标号 3
                 ......
    4routineA                                ;routineA范围内的局部标号4
                  ......
    otherstuff ROUT                      ;定义新的局部标号的有效范围

 

 

----------------------------------------------------------------------

 

ADS中ARM汇编语言程序设计的符号引用规范

 

Error:Undefined symbols ....
    找到引用符号的汇编源文件和定义符号的汇编源文件仔细检查和对比,符号没有写错,而且在引用符号之前确实把符号使用IMPORT引入了进来。百思不得其解时,突然想到在定义符号的文件中没有对符号EXPORT。非常低级的错误。
    在汇编语言程序设计中,养成良好的编程习惯,形成良好的编码风格是非常重要的。 这里仅根据个人习惯和体会略谈一下使用ADS进行ARM汇编语言程序设计时的符号引用规则,主要是对不同性质的符号使用不同的引用办法:
    (1)对于寄存器地址定义以及通用的常量或符号定义(使用EQU定义),可以按类定义在一个.s汇编文件中,在要使用这些定义的源文件中可使用INCLUDE将该.s汇编文件包含进来
    这样做的好处是:避免大量的IMPORT和EXPORT伪语句,增强代码的可读性,另外,对于多个源文件要使用许多相同寄存器地址定义或常量定义的场合,这样做可以大大压缩代码尺寸(经笔者实践证实)。
    (2)对于代码段的地址标号或函数入口地址标号(函数名),在代码段或函数的定义处使用EXPORT输出;在要调用该代码段或函数的源文件中使用IMPORT将符号引入。
    一定要保证IMPORT和EXPORT是成对使用的,若不EXPORT则IMPORT无效,若只EXPORT而不IMPORT也无法引用符号。

 

原创粉丝点击