浅谈ARM 汇编中的标号(Labels)

7.6 Labels

标号


在ARM汇编中,标号就是一个符号,它代表着汇编程序中指令或数据的内存地址。


内存地址可能是PC相对(PC-relative)、寄存器相对( register-relative)或绝对地址。

默认情况下,标号只在定义它的源文件中可见,除非你使用EXPORT指示符把它的可见性改变为全局可见。


标号所代表的内存地址是在源代码被汇编时计算的。汇编时,汇编器计算从定义这个标号的节(section)

的起始点到标号之间的距离,这个距离值就表示标号的内存地址。在定义标号的节中引用这个标号可以使

用寄存器PC(R15)值加上或减去一个偏移量值。这就叫做PC相对寻址(PC-relative addressing)。


定义在其他节(section)中的标号,它的内存地址是在链接的时候计算的,因为只有在链接器为程序中的

每一个节(section)在内存中都分配了一个特定的地址时,才能为不再同一个节中定义的标号计算它的内

存地址。


7.7 Labels for PC-relative addresses

PC 相对地址的标号


一个标号能够表示寄存器PC(R15)的值加上或减去一个偏移量,这个偏移量就是PC与标号之间的距离。你可以使用标号作为PC相对地址来引用指令、数据定义以及节名。


使用这些标号来最为跳转指令(branch)的目标地址,或访问嵌入在代码段中的小的数据项。你可以对指令或一些数据定义指示符定义PC相对地址标号。


你可以把AREA指示符中的节名作为PC相对地址的标号来使用。在这种情况下,标号的值代表的是这个节(section)的首字节的地址。当从ARM到Thumb或从Thumb到ARM状态之间跳转时,ARM不推荐使用节名来作为跳转指令的目标地址,因为在这种情况下,处理器不能正确地进行状态的改变。


寄存器相对地址标号

7.8 Labels for register-relative addresses


一个标号可以表示一个指定寄存器的值与一个数字值之和。你可以在存储映射(storage map)中定义这种标号。这种标号通常用来访问数据节(data sections)中的数据。


基于在存储映射中定义的标号,你还可以使用EQU指示符来定义寄存器相对地址标号。


存储映射定义示例:

            MAP    0, r9

            MAP    0xff, r9


绝对地址标号

7.9 Labels for absolute addresses


一个标号能够表示代码或数据的绝对地址。


这种标号表示的内存地址是范围在0 到 2的32次幂-1之间的数字常量。这些标号表示的是内存的绝对地址。


你可以使用EQU指示符来定义表示绝对内存地址的标号。你可以为这种标号指定ARM、Thumb或数据属性来确保在代码中引用它们时,这中标号能够被汇编器正确的处理。


绝对地址标号定义示例:

             abc    EQU    2                                        ; 分配数字值2给标号abc

             xyz      EQU    label+8                             ;分配地址值(label + 8)给标号xyz

             fiq       EQU    0x1C,CODE32             ;分配绝对地址值0x1C给标号fiq,并且通过属性CODE32标志它为代码


局部数字标号

7.10 Numeric local labels


局部数字标号是这样一种类型的标号:你是通过数字而不是名称进行引用。它们的用法与PC相对型标号的用法类似,但是局部数字标号的范围更窄。


一个局部数字标号是一个值为0到99之间的数值,还可以在数字值后面跟上一个名称。与其它标号不同的是,在一个节中数字标号可以被定义许多次,

而且同一个数字标号可以被使用多次。


局部数字标号不会出现在目标文件中。这就意味着汇编调试器不能在局部数字标号上设置断点,但汇编器可以在使用KEEP指示符保留的局部字符命

名标号上设置断点。


在汇编语言模块中的源码中,一个局部数字标号可以用来代替下列情况中的以字符命名的标号:

    *  源代码行中只有标号,既没有指令也没有指示符

    *  源代码行中有一条指令

    *  源代码行中有一条产生指令或产生数据的指示符


局部数字标号通在你通常会使用PC相对标号的地方。


局部数字标号一般用在例程中循环和条件执行的代码部分,或用在仅在局部使用的小子例程中。当你意欲在宏中产生标号时局部数字标号就显得特别地有用。


局部数字标号的作用域范围要受到AREA 指示符的限制。使用ROUT指示符可以更严格地限制局部数字标号的作用域范围。一个对局部数字标号的引用指向

一个在同一个范围内的匹配的标号。如果在这个范围内前后两个方向上都没有匹配的标号,那么汇编器会产生错误信息而且汇编器停止汇编操作。


你甚至能在同一个范围内使用相同的数字值来引用不止一个局部数字标号。默认情况下,汇编器按照如下规则来解析对一个局部数字标号的引用:


       * 如果在这个范围内有不止一个符合的标号,那么汇编器选择具有相同数字值的距离引用最近的那个数字局部标号。

       * 如果在这个范围内标号引用的之前处没有匹配的标号,那么汇编器选择在标号引用的后面寻找具有相同数字值的匹配标号。


如果需要,可以使用可选的参数在修改标号匹配的模式。


局部数字标号的语法格式

7.11 Syntax of numeric local labels


当引用局部数字标号时,你可以指定汇编器如何搜索匹配的标号。


语法格式:

n{routname}   ;一个局部数字标号

%{F|B}{A|T}n{routname}    ;对一个局部数字标号的引用


 说明:

      n  是一个表示局部数字标号的范围在0到99之间的数字值。

      routname  是一个表示当前作用域范围的范围名称。

    

      % 标志一个对 局部数字标号的引用。

      F  是一个指示标志,指示汇编器只从引用处向前搜索匹配的标号。

      B  是一个指示标志,指示汇编器只从引用处向后搜索匹配的标号。

      A  是一个指示标志,指示汇编器搜索所有级别的宏。

      T  是一个指示标志,指示汇编器只搜索当前宏。


用法:

     如果既没有指定F也没有指定B,那么汇编器先从引用处先后搜索,然后在从引用处向前搜索。

    

     如果既没有指定A也没有指定B,那么汇编器从当前宏开始逐级向顶层宏搜索,但是不搜索当前宏中的宏。


     如果在局部数字标号或对其引用中指定了routname,那么汇编器根据routname检查前置最近的ROUT指示符,如果不能正确的匹配,那么汇编器则产生

     一条错误信息,然后停止汇编过操作。


你可能感兴趣的:(ARM汇编)