這是來自 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
使用單反斜杠呢?預處理時是否經過特殊處理?
另一個問題是:陳述句.L
中符號名前面的那個是什么.equ
?它有什么特殊含義,還是只是為了表達它是一個長值?
uj5u.com熱心網友回復:
.L
是檔案本地標簽,在符號表中不可見。 https://sourceware.org/binutils/docs/as/L.html。
至于\num
C 前處理器完成擴展后,再次閱讀 GAS 手冊:https .irp
://sourceware.org/binutils/docs/as/Irp.html需要在宏內部擴展引數名稱。GAS 宏通常也\name
用于.macro
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424406.html
上一篇:如何在Angular的打字稿中獲取2年之間的月份串列
下一篇:組裝乒乓球-以更有效的方式洗掉球