欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hexagon Binutils GNU 手册(8)

程序员文章站 2022-07-14 12:38:06
...

2.6 Directives(续2.6.40)

2.6.41 .lcommon

**
.lcommon symbol, length [,align] [,access]
.lcomm symbol, length [,align] [,access]**

为由符号symbol表示的局部公共保留长度length(绝对表达式)字节。 符号symbol的段和值​​是新产生的且局部共用。 地址在 bss 段中分配,因此在运行时字节从零开始。 符号symbol未声明为全局(参见第 2.6.31 节),因此通常对链接器不可见。

可选的 align 参数指定 bss 段中符号的所需对齐方式,表示为字节边界(例如,16 对齐意味着地址的最低有效 4 位应为零)。 对齐必须是绝对表达式,并且必须是 2 的整数幂。 如果链接器为公共符号分配未初始化的内存,它会在放置符号时使用对齐方式。 默认对齐是小于或等于符号大小的 2 的最大幂,最大为 16。

可选的 access 参数指定要对符号进行的最小内存访问的大小,以字节表示(例如,值 2 意味着最小的内存访问将是 16 位)。 默认值是由 align 参数指定的值。

注意 
    -G 选项(第 2.2.2.6 节)确定 .lcommon 是将符号分配给处理器全局 bss 段(第 2.4.3 节)还是标准 bss 段。

    两种拼写(.lcomm 和 .lcommon)都被接受为指令名称。

2.6.42 .list

.list
控制(与 .nolist 指令一起)是否生成程序集列表。 这两个指令维护一个内部计数器(最初为零)。 .list 递增计数器,而 .nolist 递减它。 只要计数器大于零,就会生成装配列表。

默认情况下,列表被禁用。 当你启用它们时(使用 -a 命令行选项;参见第 2.2.2.3 节),列表计数器的初始值为 1。

2.6.43 .loc

.loc fileno lineno [column] [options…]

将行添加到与紧随其后的汇编指令相对应的 .debug_line 行号矩阵。

fileno 是一个正整数,它指定文件名表中条目的索引。

linenocolumn 是正整数,它们指定指定文件中的位置。

注意 
    fileno、lineno 和可选的column参数在添加行之前应用于 .debug_line 状态机。

options 可以按任意顺序指定以下一个或多个标记:

  • basic_block
    将 .debug_line 状态机中的 basic_block 寄存器设置为 true
  • prologue_end
    将 .debug_line 状态机中的 prologue_end 寄存器设置为 true
  • epilogue_end
    将 .debug_line 状态机中的 epilogue_begin 寄存器设置为 true
  • is_stmt value
    将 .debug_line 状态机中的 is_stmt 寄存器设置为指定值(必须为 0 或 1)
  • isa value
    将 .debug_line 状态机中的 isa 寄存器设置为指定值(必须是无符号整数)
注意    
    该指令仅在生成 DWARF 2 调试信息时有效(第 2.2.2.6 节)。  如需更多信息,请访问 www.dwarfstd.org。

    文件名索引向用户公开,因为文件名表与 DWARF 2 调试信息的 .debug_info 段共享。  因此,用户必须知道表条目将具有的确切索引。

2.6.44 .long

.long [expr [,expr]…]

将指定的表达式生成为存储在连续地址中的 32 位数字。
接受零个或多个用逗号分隔的表达式。

注意 
    .long 等同于 .int(第 2.6.37 节)。

2.6.45 .macro

.macro name
.macro name argument …

定义生成汇编输出的宏指令。 例如,给定以下宏定义:

.macro assign_r1 p
r1=\p
.endm

…宏调用:

assign_r1 r2

…生成以下汇编输出:

r1 = r2

宏定义中指定的宏名称用于随后调用宏。
如果宏定义了参数,则参数名称在宏定义中指定在宏名称之后,并用逗号或空格分隔:

  • 可以通过在参数名称后面加上 =default_value 来为任何宏参数定义默认值。 如果参数传递一个空值,则使用默认值。
  • 使用后缀 :req 声明的宏参数必须始终传递一个非空值。
  • 使用后缀 :vararg 声明的宏参数分配给宏调用中传递的所有剩余参数。

以下示例演示了宏参数的使用:

.macro comm

该指令开始定义一个名为 comm 的宏,它不接受任何参数。

.macro plus1 p, p1
.macro plus1 p p1

这些指令显示了开始定义宏 plus1 的两种不同方式,该宏接受两个参数 p 和 p1。 在宏定义中,通过在参数前面加上反斜杠字符来计算参数(例如,r1=\p+\p1)。

.macro reserve_str p1=0 p2

该指令开始定义一个名为 reserve_str 的宏,它接受两个参数。 p1 被分配了一个默认值,而 p2 没有。 这个宏可以被称为 ‘reserve_str a,b’(\p1 评估为a,\p2 评估为b)或 ‘reserve_str,b’(\p1 评估为其默认值0,\p2 评估为b )。

注意 
    指定空白参数时必须使用逗号作为分隔符。

在宏调用中,参数值可以通过位置或关键字指定。 例如,宏调用 ‘plus1 9,17’ 等价于 ‘plus1 p1=17, p=9’

\@

汇编器维护一个计数器来记录它执行了多少宏。 此计数器的值可通过伪变量 *“@”在宏定义中访问。 请注意,“@”*不能在宏定义之外使用。

.exitm

该指令用于提前退出当前宏定义(第 2.6.26 节)。

.endm

该指令标志着宏定义的结束(第 2.6.21 节)。
宏可以递归定义。 例如,以下宏定义使用递归在内存中生成一系列数据值:

.macro sum from=0, to=5
.long \from
.if \to-\from
sum "(\from+1)",\to
.endif
.endm

鉴于此定义,调用 *“sum 0,5”*会生成以下汇编语句:

.long 0
.long 1
.long 2
.long 3
.long 4
.long 5

注意宏名称和参数名称可以定义为任何标识符,包括通常保留用于指令语法的符号。 在某些情况下,这可能会导致宏参数无法按预期工作 - 有关详细信息,请参阅 .altmacro 指令(第 2.6.6 节)。

如果宏定义试图重新定义现有的宏名称,汇编器将生成错误消息。 只有在使用 .purgem 指令(第 2.6.53 节)首次回收宏名称时,才能重新定义宏名称。

如果宏调用没有为给定参数指定值,并且该参数没有定义的默认值,则该参数将在宏定义中作为空字符串进行评估。

2.6.46 .noaltmacro

.noaltmacro
禁用宏处理器中的附加功能(第 2.6.6 节)。

2.6.47 .nolist

.nolist

控制(与 .list 指令一起)是否生成程序集列表。 这两个指令维护一个内部计数器(最初为零)。 .list 增加计数器,而 .nolist 减少它。 只要计数器大于零,就会生成装配列表。

2.6.48 .octa

.octa [bignum [,bignum]…]
将指定的 bignums(第 2.3.6 节)生成为存储在连续地址中的 16 字节整数。

接受零个或多个用逗号分隔的 bignums

注意
    术语“octa”来自处理器,其中“word”是两个字节;因此,16字节的8word。

2.6.49 .org

.org new-lc, fill
将当前段的位置计数器推进到 new-lcnew-lc 要么是绝对表达式,要么是与当前子节具有相同子段的表达式。 也就是说,不能使用 .org 来混合段:如果 new-lc 有错误的段,则 .org 指令将被忽略。

.org 只能增加位置计数器,或者保持不变; 你不能使用 .org 向后移动位置计数器。

因为汇编器试图一次汇编程序,所以不能取消定义 new-lc

请注意,原点是相对于部分的开头,而不是相对于小节的开头。 这与其他人的汇编程序兼容。

当(当前小节的)位置计数器被推进时,中间的字节被fill填充,fill应该是一个绝对表达式。 如果省略逗号和填充,默认为零。

2.6.50 .p2align

.p2align[wl] abs-expr [,abs-expr] [,abs-expr]
填充位置计数器(在当前小节中)直到它是 2x 的整数倍,其中 x 是指定表达式的值。 例如,’.p2align 3’ 使位置计数器前进,直到它是 8 的整数倍(即 23)。

注意 
    如果当前位置计数器已经是目标值的整数倍,则该指令不执行任何操作。

第一个参数(必须是绝对表达式)可以解释为指定位置计数器在前进后必须包含的低位零位的数量。 参数值不应超过 17。

第二个参数(也是一个绝对表达式)指定要存储在填充字节中的填充值。 如果省略此参数,则填充字节通常为零,但在文本部分中,该空间由 NOP 指令填充。

第三个参数(也是一个绝对表达式)指定此对齐指令要跳过的最大字节数。 如果执行对齐需要跳过比指定值更多的字节,则不执行对齐。

.p2alignw.p2alignl.p2align 的变体:

  • .p2alignw 将填充模式视为两个字节的字值
  • .p2alignl 将填充模式视为四字节长字值

例如,.p2alignw 2,0x368D 对齐到 4 的倍数。如果它跳过 2 个字节,它们将用值 0x368D 填充。 如果它跳过 1 或 3 个字节,则填充值未定义。

注意 
    第二个参数可以通过在第一个和第三个参数之间放置两个逗号来省略。  如果你希望在适当的时候用 NOP 指令填充对齐,这将很有用。