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

https://yq.aliyun.com/ziliao/474443

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 汇编中的标号(Labels)的全部内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有浅谈ARM 汇编中的标号(Labels)的相关内容,欢迎继续使用右上角搜索按钮进行搜索ARM汇编 ,以便于您获取更多的相关知识。

=====================================================================
(3)符号
在ARM 汇编中,符号可以代表地址、变量、数字常量。当符号代表地址时又称为标号,符号就是变量的变量名、数字常量的名称、标号,符号的命名规则如下:
a. 符号由大小写字母、数字以及下划线组成;
b. 除局部标号以数字开头外,其它的符号不能以数字开头;
c. 符号区分大小写,且所有字符都是有意义的;
d. 符号在其作用域范围你必须是唯一的;
e. 符号不能与系统内部或系统预定义的符号同名;
f. 符号不要与指令助记符、伪指令同名。

=====================================================================

ARM汇编中的标号
标号(LABEL)是为一组机器指令所起名字,表示程序中的指令或者数据地址的符号。标号可有可无,只有当需要用符号地址来访问该语句时,才给此语句赋予标号。通过在目标地址的前面放上一个标号,可以在指令中使用标号来代替直接使用地址。标号是程序目标标志,总是和某地址相联系,供转移或循环指令控制转移使用。 标号是编译程序使用的,也就是说程序中最后生成的代码中标号都换成了相应的数值。

因标号表示是指令地址,所以它有三个属性,即段属性、偏移属性和类型属性。段属性即段地址,标号段必须在CS中。偏移属性是表示该标号到段首地址距离,单位是字节,是16位无符号整数。类型属性是距离属性,指标号和转移指令距离,该标号在本段内引用,距离在-128~ 127之间时称短标号,距离属性为SHORT,当标号在本段,距离在-32768~ 32767之间时称近标号,距离属性为NEAR,当引用标号指令和标号不在同一段时称远标号,距离属性为FAR。

根据标号的生成方式可分为3种:

1.基于PC的标号

基于PC的标号是位于目标指令前或者程序中数据定义伪操作前的标号。这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量。常用于表示跳转指令的目标地址,或者代码段中所嵌入的少量数据。

2.基于寄存器的标号

基于寄存器的标号常用MAP和FIELD未定义操作,也可以该用EQU伪定义。这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数据常量。常用于访问数据段中的数据。

3.绝对地址

绝对地址是一个32位数据。它可以寻址2的32次方 -1,即直接可以寻址整个内存空间。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值