#define 语句中的单反斜杠和双反斜杠,单名的起始 .L 是什么? (arm64 汇编)

single back slash and double back slash in #define statement, and what is the starting .L for singal names? (arm64 assembly)

这是来自 linux 5.4.21.

的代码
==== ./arch/arm64/include/asm/sysreg.h

#define __DEFINE_MRS_MSR_S_REGNUM               \
"   .irp    num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" \
"   .equ    .L__reg_num_x\num, \num\n"            \
"   .endr\n"                        \
"   .equ    .L__reg_num_xzr, 31\n"

在 __DEFINE_MRS_MSR_S_REGNUM 中,我理解 .irp.equ 指令。但是为什么它使用\num而不是\num呢?我猜这是为了在特殊字符之前转义,因为 \ 是一个特殊字符,而预处理器使它成为 .L__reg_num_x\num, \num。但是为什么 \n 使用单个反斜杠呢? preprocessing的时候有没有特殊处理?
另一个问题是:.equ 语句中符号名称前面的 .L 是什么?是不是有什么特殊的含义,还是只是表示它是一个长值?

.L是一个file-local标签,在符号table中不可见。 https://sourceware.org/binutils/docs/as/L.html.

至于\num C预处理器展开后,再看GAS手册: https://sourceware.org/binutils/docs/as/Irp.html .irp 取一个参数名在宏内部展开。 GAS 宏通常也将 \name 用于 .macro