指示符
|
描述
|
.text
|
后续内容存放在代码节(机器代码)。
|
.data
|
后续内容存放在数据节(全局变量)。
|
.bss
|
后续内容存放在
bss
节(初始化为
0
的全局变量)。
|
.section .foo
|
后续内容存放在名为
.foo
的节。
|
.align n
| 后续数据按 2 n 字节对齐。如.align 2 指示后续数据按字对齐 |
.balign n | 后续数据按 n 字节对齐。如.balign 4 指示后续数据按字对齐 |
.globl sym | 声明 sym 为全局符号,可从其他文件引用。 |
.string "str" | 将字符串 str 存放在内存,以空字符结尾。 |
.byte b1,…, bn
|
在内存中连续存放
n
个
8
位数据。
|
.half w1,…,wn
| 在内存中连续存放 n 个 16 位数据。 |
.word w1,…,wn | 在内存中连续存放 n 个 32 位数据。 |
.dword w1,…,wn
| 在内存中连续存放 n 个 64 位数据。 |
.float f1,…, fn |
在内存中连续存放
n
个单精度浮点数。
|
.double d1,…, dn | 在内存中连续存放 n 个双精度浮点数。 |
.option rvc
| 压缩后续指令(见第 7 章)。 |
.option norvc |
不压缩后续指令。
|
.option relax
| 允许链接器松弛后续指令。 |
.option norelax
|
禁止链接器松弛后续指令。
|
.option pic | 后续指令为位置无关代码。 |
.option nopic | 后续指令为位置相关代码。 |
.option push | 将当前所有.option 选项压栈,后续.option pop 可恢复。 |
.option pop | 将选项弹栈,将所有.option 恢复为上次.option push 的配置。 |
.weak | .weak表示如果一个符号没有被定义,编译器会对使用该符号的语句执行一个特殊操作,即替换为NOP(无操作指令),从而避免编译错误。 .weak的作用还体现在它允许程序员在汇编语言中定义一种“弱函数”,这种函数可以被其他文件中的同名函数覆盖。如果程序员没有重新定义这个函数,那么编译器就会执行.weak声明的函数,并且不会报错。 |
补充说明:链接器松弛(
linker relaxation
)
“
跳转并链接
”
指令的
PC
相对地址字段有
20
位,因此一条指令能跳得很远。尽管编
译器为每个外部函数的引用都生成两条指令,但很多时候只有一条是必须的。这种优
化能同时节省时间和空间,因此链接器会扫描数趟代码,尽可能将两条指令替换为一
条。由于每趟可能会缩短调用点和函数之间的距离,使该距离可在一条指令中容纳,
所以链接器会不断优化代码,直到代码不再变化。该过程称为
链接器松弛
,其名源于
求解方程组的松弛技术。除了过程调用,对于
gp
±
2 KiB
范围内的数据寻址,
RISC-V
链接器也会使用全局指针进行松弛,从而消除一条
lui
或
auipc
。类似地,链接器
也会对位于
tp
±
2 KiB
范围内的线程本地存储寻址进行松弛。