在ARM汇编中,标号就是一个符号,它代表着汇编程序中指令或数据的内存地址。标号分为全局标号与局部标号。
全局标号:在整个项目中是唯一的,可以直接用于跳转等操作。因为比较简单,这里不作介绍。
局部标号:
局部数字标号是通过数字而不是名称进行引用。它们的用法与PC相对型标号的用法类似,但是局部数字标号的范围更窄。
一个局部数字标号是一个值为0到99之间的数值,还可以在数字值后面跟上一个名称。与其它标号不同的是,在一个节中数字标号可以被定义许多次,而且同一个数字标号可以被使用多次。局部数字标号不会出现在目标文件中。这就意味着汇编调试器不能在局部数字标号上设置断点,但汇编器可以在使用KEEP指示符保留的局部字符命
名标号上设置断点。
在汇编语言模块中的源码中,一个局部数字标号可以用来代替下列情况中的以字符命名的标号:
* 源代码行中只有标号,既没有指令也没有指示符
* 源代码行中有一条指令
* 源代码行中有一条产生指令或产生数据的指示符
局部数字标号通在你通常会使用PC相对标号的地方。
局部数字标号一般用在例程中循环和条件执行的代码部分,或用在仅在局部使用的小子例程中。当你意欲在宏中产生标号时局部数字标号就显得特别地有用。
局部数字标号的作用域范围要受到AREA 指示符的限制。使用ROUT指示符可以更严格地限制局部数字标号的作用域范围。一个对局部数字标号的引用指向
一个在同一个范围内的匹配的标号。如果在这个范围内前后两个方向上都没有匹配的标号,那么汇编器会产生错误信息而且汇编器停止汇编操作。
你甚至能在同一个范围内使用相同的数字值来引用不止一个局部数字标号。默认情况下,汇编器按照如下规则来解析对一个局部数字标号的引用:
* 如果在这个范围内有不止一个符合的标号,那么汇编器选择具有相同数字值的距离引用最近的那个数字局部标号。
* 如果在这个范围内标号引用的之前处没有匹配的标号,那么汇编器选择在标号引用的后面寻找具有相同数字值的匹配标号。
如果需要,可以使用可选的参数在修改标号匹配的模式。
局部数字标号的语法格式
当引用局部数字标号时,你可以指定汇编器如何搜索匹配的标号。
语法格式:
n{routname} ;一个局部数字标号
%{F|B}{A|T}n{routname} ;对一个局部数字标号的引用
说明:
n 是一个表示局部数字标号的范围在0到99之间的数字值。
routname 是一个表示当前作用域范围的范围名称。
% 标志一个对 局部数字标号的引用。
F 是一个指示标志,指示汇编器只从引用处向前搜索匹配的标号。
B 是一个指示标志,指示汇编器只从引用处向后搜索匹配的标号。
A 是一个指示标志,指示汇编器搜索所有级别的宏。
T 是一个指示标志,指示汇编器只搜索当前宏。
用法:
如果既没有指定F也没有指定B,那么汇编器先从引用处先后搜索,然后在从引用处向前搜索。
如果既没有指定A也没有指定B,那么汇编器从当前宏开始逐级向顶层宏搜索,但是不搜索当前宏中的宏。
如果在局部数字标号或对其引用中指定了routname,那么汇编器根据routname检查前置最近的ROUT指示符,如果不能正确的匹配,那么汇编器则产生一条错误信息,然后停止汇编过操作。
局部标号使用实例如下:
MACRO
$L3MM$L4,$L5,$REG5
BEQ%$L4
BNE %$L3
$L3MOV$REG5,#5
B%$L5
$L4MOVR6,#6
$L5NOP
MEND
AREAROUT1,CODE,READONLY
ENTRY
CODE32
STARTMOVR1,#1
CMPR1,#2
routAROUT
3MM4,5,R5
otherROUT
CMPR1,#1
3MM4,5,R5
BSTART
END